프로그래밍/코딩 테스트 연습

[백준] 2525번 : 오븐 시계 (2단계) (C++)

w_w 2024. 1. 8. 10:19
 

2525번: 오븐 시계

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

www.acmicpc.net

 


 

문제

 

 

 


 

 

해석

 

https://whitecode2718.tistory.com/61?category=1137840

 

[백준] 2884번 : 알람 시계 (2단계) (C++)

https://www.acmicpc.net/problem/2884 2884번: 알람 시계 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있

whitecode2718.tistory.com

 

알람 시계 문제에서 시간을 받는 범위가 늘어나고 빼는 게 아닌 더해지는 시간이 된 것뿐입니다. 

 

만약 이 문제를 입력받는 데이터에 따라 시간을 더한다면 조건은 매우 복잡해질 겁니다. (더해진 분이 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;

}

 

 

 


 

 

정리

 

알람 시계와 같은 문제라고 생각하고 코드를 별생각 없이 작성해 특수한 상황을 놓쳤습니다.

 

시간에 대한 기준을 세웠으니 시간에 대한 출력을 생각했거나, 출력 조건을 제대로 살펴봤다면 실수하지 않았을 텐데 이런 부분에 연습이 더 필요할 것 같습니다.