본문 바로가기

백준

2530 인공지능 시계

먼저 문제를 읽고 이런 식으로 조건을 정리했다.

 

그리고 생각한 풀이

 

전에는 눈에 힘 빡 주고 풀었는데 이제는 그냥 적는게 편하다. 정리도 되고 놓친 조건 찾기도 쉽고

 

저기 오른쪽에 sec %= 60으로 적었는데 (59 + 2) % 60이 되어야 할 것 같다 (코드에는 반영 함)

 

#include <iostream>

int main() {
    int now_hour, now_min, now_sec;
    int time;

    scanf("%d %d %d %d", &now_hour, &now_min, &now_sec, &time);
    
    int hour = time / 3600;
    time %= 3600;
    int minute = time / 60;
    time %= 60;
    int sec = time;
    
    int add = 0;
    add = (now_sec + sec) / 60;
    now_sec = (now_sec + sec) % 60;
    
    add = (now_min + minute + add) / 60;
    now_min = (now_min + minute + add) % 60;
    
    now_hour = (now_hour + hour + add) % 24;
    
    printf("%d %d %d", now_hour, now_min, now_sec); 
}

 

아 근데 틀렸다.

 

 

#include <iostream>

int main() {
    int now_hour, now_min, now_sec;
    int time;

    scanf("%d %d %d %d", &now_hour, &now_min, &now_sec, &time);
    
    int hour = time / 3600;
    time %= 3600;
    int minute = time / 60;
    time %= 60;
    int sec = time;
    
    int add = 0;
    add = (now_sec + sec) / 60;
    now_sec = (now_sec + sec) % 60;
    
    now_min = (now_min + minute + add) % 60;
    add = (now_min + minute + add) / 60;
    
    now_hour = (now_hour + hour + add) % 24;
    
    printf("%d %d %d", now_hour, now_min, now_sec); 
}

그다음 어디서 틀렸나 했더니 

 

    now_min = (now_min + minute + add) % 60;
    add = (now_min + minute + add) / 60;

 

이 부분에서 틀린 것 같았다. 보니깐 add로 먼저 분을 계산하고 add값을 바꿔줘야 하는데 순서가 반대여서 add값이 이상하게 계산된 듯하다.

 

하지만 결과는 또 틀렸다

 

 

#include <iostream>

int main() {
    int now_hour, now_min, now_sec;
    int add_min;
    int time;

    scanf("%d %d %d %d", &now_hour, &now_min, &now_sec, &time);
    
    int hour = time / 3600;
    time %= 3600;
    int minute = time / 60;
    time %= 60;
    int sec = time;
    
    int add = 0;
    add = (now_sec + sec) / 60;
    now_sec =  (now_sec + sec) % 60;
    
    add_min = (now_min + minute + add) % 60;
    add = (now_min + minute + add) / 60;
    
    now_hour = (now_hour + hour + add) % 24;
    
    printf("%d %d %d", now_hour, add_min, now_sec); 
}

그래서 어쩌지 하다가 다시 종이에 (전자종이..) 알고리즘을 짜봤다. 그러다 잘못된 부분을 찾았다! 

 

    now_min = (now_min + minute + add) % 60;
    add = (now_min + minute + add) / 60;

 

아까 add값이 바꾼다고 순서를 바꿨는데 그럼 now_min값도 변경된다! 

그래서 그냥 값을 대입하지 말고 출력할까 하다 그럼 시 - 분 - 초 순서로 출력되는게 아니라 초 - 분 - 시 순서로 출력되기 때문에 min값만 따로 변수를 만들어서 출력했다. 

 

 

결과는 맞았다!!! 야호!!! 

 

다음에 풀 때는 이런 부분에서도 틀릴 수 있다는 걸 염두에 둬야겠다. 분명 이상한게 없다 생각하고 풀었는데 이런 부분에서 틀리는구나. 

 

#include <iostream>

int main() {
    int h, m, s, t;
    scanf("%d %d %d %d", &h, &m, &s, &t);
    
    s += t;
    m += s / 60;
    h += m / 60;
    
    printf("%d %d %d", h%24, m%60, s%60);
    
    return 0;
}

 

알고보니 더 좋은 방법이 있었다! 전에 코드 작성하다가 뭔가 같은 일 두 번 반복하는 것 같다고 생각했었다. 근데 이렇게 해도 됐었구나. 

 

그냥 뭉텅이로 다 더해버리고 마지막에 출력할 때 나눠준다. 근데 이게 머리로는 이해가 가는데 마음으로는 이해가 잘 안간다. 저래도 되나..? 되 .. 되.. 구나.. 다음에도 써먹어야겠다. 

 

코드 길이가 반이나 줄어들었다.

 

'백준' 카테고리의 다른 글

10162 전자레인지  (0) 2019.09.30
2480 주사위 세 개  (0) 2019.09.30
1712 손익분기점  (0) 2019.09.29
1212 8진수 2진수  (0) 2019.09.29
10039 평균점수  (0) 2019.09.29