본문 바로가기

Algorithm/Math

(C++) - 백준(BOJ) 12840 : 창용이의 시계

반응형

https://www.acmicpc.net/problem/12840

 

12840번: 창용이의 시계

창용이는 여름을 맞이하여 ‘정창용’ 이름이 쓰인 한정판 섬머 에디션 시계를 구입했다. 왠지 오늘은 001도 가고 싶지 않고 시계를 가지고 놀고만 싶다. 우린 방에 있는 창용이가 시계를 가지고

www.acmicpc.net

시간에 대한 개념을 이용한 구현 + 수학 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

시간 h, 분 m, 초 s, 쿼리 수 q, 명령어 t, 명령어가 1또는 2인 경우 입력받을 c, 현재 시간초를 저장할 sec를 선언 후 적절히 입력받습니다.

📔 풀이과정

입력받은 시, 분, 초를 모두 초에 대해 환산하고 sec에 값을 저장합니다.

23시 59분 59초인 상황에서 1초가 지나면 다음날이 되는 아이디어를 통해 24시간이 하루며 이는 86400초, c가 86400을 넘어가면 다음날 또는 이전날이 되므로 c가 큰 값이라도 % 86400 연산으로 값을 int형의 범위 내에서 다룰 수 있습니다.

논리는 다음 3가지 경우로 추릴 수 있습니다.

1. t가 1인 경우 (sec + c) % 86400

2. t가 2인 경우 (sec - c) % 86400

3. t가 3인 경우 "sec / 3600 시" "sec / 60 % 60" 분 "sec % 60초"가 답이 됩니다.

📔 정답출력

"sec / 3600 시" "sec / 60 % 60" 분 "sec % 60초"형태로 출력해줍니다.


📕 Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
using namespace std;
int h, m, s, q, t, c, sec;
int main(){
    fastio;
    cin >> h >> m >> s >> q;
    sec = h * 3600 + m * 60 + s;
    while(q--){
        cin >> t;
        if(t == 1){
            cin >> c;
            sec = (sec + c) % 86400;
        }
        else if(t == 2){
            cin >> c;
            sec = (sec - c) % 86400;;
            if(sec < 0) sec += 24 * 3600;
        }
        else{
            h = sec / 3600;
            m = sec / 60 % 60;
            cout << h << ' ' << m << ' ' <<  sec % 60 << '\n';
        }
    }
}