문제
해석
문제만 본다면 단순히 받은 시간에 45분을 빼주면 될 것 같지만 1시간이 60분이고 분에 값을 뺀 만큼 시간도 빼줘야 하기 때문에 문제가 어려워 보입니다.
이런 류의 문제를 풀 때 단순히 내가 이 문제를 해결하기 위해서 어떻게 풀건지 생각하는 게 가장 좋습니다.
저 같은 경우 분에 45분을 뺀다면, 빼야 될 분이 45분 이하일 때 시간에 -1을 한 후 분에 60을 더하고 45를 뺀 값이 결과가 되고, 시간은 -1 뺀 만큼 결과를 출력하면 된다고 처음에 생각했는데
이 방식대로 푼다면 "분이 45가 이하일 때 시간을 -1 한 후 분에 60을 더한다"와 분이 "45분 이상일 때 시간은 그대로 두고 분에 60을 뺀다"로 나눌 겁니다. 즉, 조건의 기준이 분으로 설정합니다.
분을 기준으로 했을 때 하나의 if문으로 해결할 수 있다고 생각하지만, 시간이 0일 때는 -1이 아니라 23시를 리턴해야 하기 때문에 시간에 대한 조건 또한 만들어야 해서 중첩 if문을 사용해야 할 것 같습니다. 때문에 시간을 계산하는 더 쉬운 논리를 고민하도록 합니다.
다시 문제를 다른 관점으로 풀 때 시간을 그냥 분으로 처리하는 방법을 떠올릴 수 있습니다. 즉, 1시간을 60분으로 환산 한 다음 45분을 뺀 후 60의 몫과 나머지로 다시 시간과 분으로 분리한 후 결과를 출력하면 위의 번거로운 과정을 거치지 않고, 하나의 if문으로 처리할 수 있을 겁니다.
또한 hour이 0일 때 24시 취급을 받기 때문에 조건문을 추가해야 합니다.
풀이
해석을 통해 코드를 짠다면 알고리즘은 다음과 같습니다.
a,b = input().split()
a = int(a)
if a == 0:
a = 24
min = a*60 + int(b)
min_cal = min - 45
hour = min_cal // 60
min_result = min_cal % 60
if hour == 24:
hour = 0
print(hour,min_result)
우선 a, b를 input()으로 입력받고 split()로 공백문자로 두 데이터를 구분해서 입력합니다. 문자로 입력되었기 때문에 각각 변수를 사용하려면 의도에 맞게 형변환으로 정수형으로 변환 후 연산에 이용해야 합니다. 예외조건인 a가 0으로 입력받을 경우 a를 24시로 취급하기 위해 조건식을 추가했습니다.
이후 출력을 위해 계산된 값인 min_cal을 60으로 나눈 몫을 시간으로 나머지를 min_result로 나눈 후 예외조건인 hour이 24시일 때 hour이 0으로 출력되도록 합니다.
정리
이전 2단계 문제들과 같이 조건을 코드로 변환하는 문제이지만 시간에 대한 계산 때문에 헷갈리는 부분이 있습니다.
내가 문제를 어떻게 푸는지에 대한 고민으로 프로그래밍의 계산을 유도하고 이를 코드로 작성하는 연습을 할 수 있는 좋은 문제이고, 앞으로 시간에 대한 연산을 분이나 시간으로 변환해 연산 후 다시 60으로 나눈 몫과 나머지로 시간과 분으로 분리할 수 있다는 논리를 배울 수 있었습니다.
가장 중요한 건 조건문으로 a가 0이 되는 상황과 hour가 24가 되는 특수한 경우를 생각해줘야 하는데 이는 "시간"의 변환을 기준으로 세운 코드이기 때문에 "시간"에 따라 달라지는 결과를 예측하면서 코드를 짠다면 이런 예외의 경우도 생각할 수 있습니다.
특수한 경우를 찾는 논리는 앞으로 제어문을 코드로 짤 때 항상 생각해줘야 하는 부분입니다.
'프로그래밍 > 코딩 테스트 연습' 카테고리의 다른 글
[백준] 2480번 : 주사위 세개 (2단계) (Python) (0) | 2024.02.21 |
---|---|
[백준] 2525번 : 오븐 시계 (2단계) (Python) (0) | 2024.02.21 |
[백준] 14681번 : 사분면 고르기 (2단계) (Python) (0) | 2024.02.21 |
[백준] 2753번 : 윤년 (2단계) (Python) (0) | 2024.02.21 |
[백준] 9498번 : 시험 성적 (2단계) (Python) (0) | 2024.02.21 |