[파이썬] 백준 12840 : 창용이의 시계

asaei623·2023년 2월 10일
0

[Algorithm] 정렬

목록 보기
6/6

백준 12840 : 창용이의 시계 바로가기

✏️ 풀이

전체적인 흐름을 간단히 얘기하자면, h m s 형태의 시간을 n초 형태로 변환하여 계산한 뒤 출력할 때는 다시 h m s 형태로 바꾸어 출력한다.

입력

1, 2번은 T c 형태로, 3번은 T 형태로 입력이 들어온다.
즉 입력이 한 번에 2개가 들어올지 한 개가 들어올지 알 수 없으므로, 입력은 리스트로 받는다.

# 입력
h, m, s = map(int, sys.stdin.readline().split())
seconds = s + m * 60 + h * 3600  # h m s 형태를 n초 형태로 변환하여 seconds에 저장

q = int(sys.stdin.readline())

for _ in range(q):
    # 입력의 개수가 2개 또는 1개이므로 리스트로 받는다.
    T = list(map(int, sys.stdin.readline().split()))
    # 시계 조작
    if T[0] == 1:
        seconds += T[1]
    elif T[0] == 2:
        seconds -= T[1]
    else:
        to_hms(seconds)

출력

출력시 to_hms(sec) 함수를 통해 n초 형식을 h m s 형식으로 변환하여 출력한다.

그런데 먼저 주의해야 할 것은, n초가 시계의 범위를 넘어설 수 있다.
만약 -12359초 라면, 시간에는 음수가 없으니 그대로 출력할 수 없다. 따라서 모듈러 연산이 필요하다.

24시간을 초로 환산한 24 * 3600으로 모듈러 연산을 하면 시계의 범위 안으로 나타낼 수 있다.

특히나 파이썬의 경우 -1 % 24 = 23 과 같이 연산이 되기 때문에 양수 음수에 상관없이 다음의 코드 한줄로 처리가 가능하다.

# 시계의 범위를 넘어서지 않도록 모듈러 연산을 한다.
sec %= (24 * 3600)

h m s 형태로 바꾸는 것 역시 모듈러 연산을 사용하여 구현할 수 있다.

h = sec // 3600
sec %= 3600
m = sec // 60
sec %= 60
s = sec

전체 코드

import sys

# 함수
def to_hms(sec):
    # 시계의 범위를 넘어서지 않도록 모듈러 연산을 한다.
    sec %= (24 * 3600)

    h = sec // 3600
    sec %= 3600
    m = sec // 60
    sec %= 60
    s = sec

    print(h, m, s)


# 입력
h, m, s = map(int, sys.stdin.readline().split())
seconds = s + m * 60 + h * 3600  # h m s 형태를 n초 형태로 변환하여 seconds에 저장

q = int(sys.stdin.readline())

for _ in range(q):
    # 입력의 개수가 2개 또는 1개이므로 리스트로 받는다.
    T = list(map(int, sys.stdin.readline().split()))
    # 시계 조작
    if T[0] == 1:
        seconds += T[1]
    elif T[0] == 2:
        seconds -= T[1]
    else:
        to_hms(seconds)

0개의 댓글