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