© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 12840 - 창용이의 시계

2024-12-12
BOJ
브론즈 III
cpp
원본 문제 보기
수학
구현

문제

BOJ 12840 - 창용이의 시계

초기 시각이 주어지고, 시간을 앞으로/뒤로 이동하거나 현재 시각을 출력하는 쿼리를 처리하라.

입력

초기 시각(시, 분, 초)과 쿼리 수 N, 이후 N개의 쿼리가 주어진다. 1: 초 더하기, 2: 초 빼기, 3: 현재 시각 출력.

출력

쿼리 3이 들어올 때마다 현재 시각을 시 분 초로 출력한다.

예제

입력출력
0 0 0 3 1 100 3 2 500 1 40

풀이

시각을 초 단위로 통합 관리하고 모듈러 연산으로 범위를 유지한다.

  1. 초기 시각을 초 단위로 변환한다
  2. 쿼리 1은 초를 더하고 86400으로 나눈 나머지를 취한다
  3. 쿼리 2는 초를 빼고 음수이면 86400을 더한다
  4. 쿼리 3은 초를 시/분/초로 역변환하여 출력한다

핵심 아이디어: 시간을 초 단위로 통일하고 24시간(86400초)으로 모듈러 연산하면 날짜 경계가 자동 처리된다.

코드

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
  cin.tie(0)->sync_with_stdio(0);
 
  int h, m, s, t, n, x, y;
  cin >> h >> m >> s >> n;
  t = 3600 * h + 60 * m + s;
  for (int i = 0; i < n; i++)
  {
    cin >> x;
 
    if (x == 1)
      cin >> y, t = (t + y) % (24 * 60 * 60);
    else if (x == 2)
    {
      cin >> y;
      t = (t - y) % (24 * 60 * 60);
      while (t < 0)
        t += (24 * 60 * 60);
    }
    else if (x == 3)
      cout << t / 3600 << ' ' << (t / 60) % 60 << ' ' << t % 60 << '\n';
  }
}

복잡도

  • 시간: O(N)
  • 공간: O(1)