문제
해석
https://whitecode2718.tistory.com/61?category=1137840
알람 시계 문제에서 시간을 받는 범위가 늘어나고 빼는 게 아닌 더해지는 시간이 된 것뿐입니다.
만약 이 문제를 입력받는 데이터에 따라 시간을 더한다면 조건은 매우 복잡해질 겁니다. (더해진 분이 60의 배수만큼 시간을 더하면서 이때 시간이 24시인지를 생각해야 할 겁니다.)
때문에 이 문제도 입력받는 시간을 분단위로 전부 바꾼 후 분단위로 더하고 60을 나눈 몫과 나머지로 출력할 시간과 분으로 분리하면 됩니다.
풀이
#include<iostream>
using namespace std;
int main(){
int hour,min,turn,time;
cin >> hour >> min;
cin >> turn;
time = hour * 60 + min + turn;
hour = time / 60;
min = time % 60;
if(hour == 24)
hour =0;
cout << hour << " " << min << endl;
}
처음에 작성한 코드입니다. turn을 분단위로 받고 time(입력받은 데이터를 분단위로 바꿔 저장한 변수)에 더해 time을 다시 시간과 분으로 바꿔 출력하는 코드입니다.
알람 시계문제에서는 hour_re, min_re처럼 변환된 데이터를 저장할 변수를 따로 지정했지만, 최대한 변수를 적게 사용하려고 작성된 코드입니다. 당연히 hour_re, min_re를 사용해도 됩니다.
하지만 틀렸다고 나옵니다. 이유를 알 수 없어 질문 게시판의 반례들을 대입해서 문제를 찾았습니다.
출력해야 하는 시간이 24시간이 넘어가는 경우를 생각하지 못한 겁니다. 예를 들어 현재 시각이 23시 20분이고 더해지는 시간이 40분 이상이라면 출력은 24시 ~ 분일 겁니다. 즉, 24시가 넘어가는 경우가 발생합니다.
이 문제를 해결하려면 출력하는 코드가 24시가 넘는 다면 24를 빼면 됩니다. 24시를 0시라고 했기 때문입니다.
최종적으로 코드는 다음과 같습니다.
#include<iostream>
using namespace std;
int main() {
int hour, min, turn, time;
cin >> hour >> min;
cin >> turn;
time = hour * 60 + min + turn;
hour = time / 60;
min = time % 60;
while (1) {
if (hour < 24)
break;
hour -= 24;
}
cout << hour << " " << min << endl;
}
정리
알람 시계와 같은 문제라고 생각하고 코드를 별생각 없이 작성해 특수한 상황을 놓쳤습니다.
시간에 대한 기준을 세웠으니 시간에 대한 출력을 생각했거나, 출력 조건을 제대로 살펴봤다면 실수하지 않았을 텐데 이런 부분에 연습이 더 필요할 것 같습니다.
'프로그래밍 > 코딩 테스트 연습' 카테고리의 다른 글
[백준] 2739번 : 구구단 (3단계) (C++) (1) | 2024.01.09 |
---|---|
[백준] 2480번 : 주사위 세개 (2단계) (C++) (0) | 2024.01.08 |
[백준] 2884번 : 알람 시계 (2단계) (C++) (0) | 2024.01.08 |
[백준] 14681번 : 사분면 고르기 (2단계) (C++) (1) | 2024.01.08 |
[백준] 2753번 : 윤년 (2단계) (C++) (0) | 2024.01.07 |