반응형

안녕하세요 밤샘공부입니다~

질문이 있으시면, 아래 오픈채팅방이나 메일로 보내주세요~

[백준 2525번 파이썬]

2시간 이내에 답변 드리겠습니다. 

 

오픈챗 링크 : https://open.kakao.com/o/srASNxef

메일 주소 : studying.all.night.1114@gmail.com

 

전달력을 높이기 위해 평어체를 사용하였습니다.

 


1. 문제 설명

 

 (1) 문제

 KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다. 인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다. 그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 분 단위로 자동적으로 계산한다. 
또한, KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털 시계가 있다. 
훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.
 

 (2) 입력

  첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.

 

 (3) 출력

  첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)

 

 (4) 예제 

  ① 예시 1

   - 입력

14 30
20

   - 출력

14 50

 

 


2. 문제 해석 및 총평

 

   지난 시간 알람시계를 100% 이해했다면, 별반 다를 바 없는 문제이다. 마찬가지로 첫번째 풀이로는 '구조도'를 그려보아야 한다. 물론, 알람시계 문제의 두번째 풀이에 익숙해졌다면 바로 시간 + 분 -> 분단위로 고친 뒤 나머지 연산을 이용하여 조건문 없이 해결할 수도 있다. 그러나, 일단은 구조도 부터 그려보도록 하자. 

 

 

 (1) 첫번째 풀이. 구조도 그리기

   우선, 오븐구이를 하는데 걸리는 시간이 분단위로 주어졌으므로 이를 시간 단위로 바꾸자. (이때, 몫과 나머지 연산을 이용하면 된다.) 이후에는 알람시계 문제와 마찬가지로 두 시간과 분을 합쳤을 때, 60분이 넘어가는지 안넘어가는지, 24시를 넘어가는지 안넘어가는지를 체크해주면 된다.

[구조도 그려보기]

   첫번째 질문은. '분'의 합이 60이상인가? 이다. 60이상이라면, '시간'의 합에 1을 넘기고 60을 빼줘야할 것이다. 마찬가지로 두번째 질문은. '시간'의 합이 24이상인가? 이다. 24이상이라면, 24를 빼줘야 할 것이다. (이때는, '일' 단위에 1을 넘기는 것이지만, '일'은 표시하지 않으므로 그냥 시간에서 24만 빼주면 된다.)

 

 

 (2) 두번째 풀이. 나머지 연산의 활용

    이번에는 조건문을 쓰지 않고 풀어보자. 어떻게 하면 좋을까? 알람시계 문제와 마찬가지로 모조리 분 단위로 바꾸어 버린 후 똑같이 풀어내면 된다. 즉, 조건문을 어떻게 써야할지에 대해 머리아프게 고민할 필요가 없는 것이다. (그러나, 조건문으로 푸는 방법도 할 줄 알아야 한다. 굳이 하지 않는 것과 못하는 것은 천지차이이다.) (아래 내용은 알람 시계의 부분을 똑같이 발췌했다. 도움이 되기를 바란다.)

[시간을 모조리 분 단위로!!]

   이렇게 분단위로 바꾼 뒤, 여기에서 45분을 빼준다. 그후에 다시 시간 : 분으로 바꾸어 주는 것이다.

[예제 1 - 45분 뺀 뒤 다시 시간으로!!]

 

[예제2 - 45분 뺀 뒤 다시 시간으로!!]

   위 방법대로 분으로 바꾼 뒤 45분을 빼주면 굳이 조건문을 쓰지 않고도 문제를 해결할 수 있다. 단, 세번째 예시에서는 조금 주의해줄 필요가 있는 것이. 0시 30분은 분 단위로 바꾸어도 30분이 된다. 이때 45를 빼주게 되면 문제가 하나 발생하는데, 30-45=-15(분) 이기 때문이다! 그러므로, -15분에 1440분(24시간)을 더해주어 1425분을 만들어 주어야 한다. 그래야 23시 45분이라는 결과가 나온다. 이는, 나머지 연산을 이용하면 손쉽게 해결할 수 있는데 수학적으로 나머지는 항상 양수여야 하기 때문이다. 따라서 -15분을 1440으로 나누었을 때의 나머지는 1425분이 된다. 그러므로 분단위 시간에서 30분을 뺀 뒤 1440으로 나눈 나머지 연산을 취해 주면, 양수인 분은 그대로 그 값을 가지게 되고 음수일 경우에만 1440이 더해지는 효과를 볼 수 있다. 자세한 내용은 아래 코드를 확인해보자. 

 

 


3. 코드

 

 (1) 구조도를 그대로 옮기기

#구조도 풀이

h_0, m_0 = map(int, input().split())
time = int(input())
h_1, m_1 = time//60, time%60

if m_0+m_1 >= 60 :
    if h_0+h_1+1 >= 24 :
        print(h_0+h_1+1-24, m_0+m_1-60)
    else :
        print(h_0+h_1+1, m_0+m_1-60)
else :
    if h_0+h_1 >= 24 :
        print(h_0+h_1-24, m_0+m_1)
    else :
        print(h_0+h_1, m_0+m_1)

   처음에 그렸던 구조도를 그대로 코드로 옮겼다. 직관적이면서 가장 간편한 풀이이다. 하지만, 아래 풀이들도 여러분이 구사할 수 있었으면 하는 바램이다. 

 

 (2) 분 단위로 바꾼 뒤 나머지 연산 활용

#나머지 연산 활용

h_0, m_0 = map(int, input().split())
time = int(input())

total_time = h_0*60+m_0+time

print(total_time//60%24, total_time%60)

   나머지 연산의 논리구조를 그대로 코드로 옮겼다. 조건문을 쓰지 않고도 문제를 우아하게 풀 수 있다. 

 

 (3) 짧은 코드

#나머지 연산 활용
h_0, m_0 = map(int, input().split())
total_time = h_0*60+m_0+int(input())
print(total_time//60%24, total_time%60)

 별 차이 없기는 하다.

반응형