[알고리즘 스터디 - 1주차 4] PC방 요금

난이도

Gold 4

문제

현성이는 요즘 LINEAR 2라는 온라인 게임에 빠져있다. PC방에 가서 게임을 즐기는데, 자주 가는 PC방의 요금체계는 다음과 같다. 일반 요금으로 시간당 1000원 씩을 받으며, 야간 정액을 끊으면 5000원만 내고 밤 10시부터 다음날 아침 8시까지 사용할 수 있다. 이 PC방에서는 1시간에서 1분이라도 넘으면 새로운 1시간에 대한 요금을 부과한다. 그리고 이미 일반 요금으로 사용을 하다가 야간 정액을 쓰게 되면 일반 요금을 미리 계산을 하고 야간 정액을 쓸 수 있다. 즉, 일반 요금을 쓰다가 야간 정액을 쓰고 다시 일반 요금을 쓰게 되면 두 개의 일반 요금을 각각 따로 계산이 된다.

현성이가 게임을 시작하는 시각과 게임을 하는 시간을 입력으로 받으면 현성이가 최소로 지불해야 하는 PC방 이용 요금을 계산하는 프로그램을 작성하시오. 현성이는 한 번 게임을 시작하면 게임을 하는 시간 동안 계속 게임을 한다고 하자.

입력

입력의 첫 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 한 줄에 HH:MM D가 주어지며 HH와 MM사이에는 :(콜론)이 있고, MM과 D사이에는 한 칸의 공백이 주어진다. HH:MM은 현성이가 게임을 시작하는 시각을 나타내며 HH시 MM분부터 시작함을 의미한다. D는 현성이가 게임을 하는 시간을 분으로 나타내며 정수로 주어진다. HH:MM은 00:00부터 23:59까지의 시각으로 표시되며 모두 2자리로 표시된다(숫자가 한 자리일 때에는 앞에 0이 붙어서 주어진다.). 사람 체력의 한계상 D는 3일 동안의 시간까지만 입력된다. (1 ≤ D ≤ 4320)

출력

각 테스트 케이스에 대해서 현성이가 지불해야 하는 최소의 PC방 이용 요금을 한 줄에 하나씩 출력한다(단위 원은 생략).

예제 입력

4
14:30 180
19:28 242
23:25 580
21:10 765

예제 출력

3000
5000
7000
8000

해설 및 후기

쉽게 봤다가 디테일에서 많이 털렸다. 단순 구현이기 때문에 설명할 것이 많진 않으나 03시 이후 들어온 손님이 301분 이상 컴퓨터를 사용할 때, 21시 이전에 사용하던 손님이 22시부터 08시까지 야간 정액을 사용할 때 등에 대한 처리가 확실해야 AC를 받을 수 있다. 코딩 테스트에서는 어려운 알고리즘 이론의 사용이나 이해를 요구하는 게 아니라 요구대로 구현이 확실하게 되었는지를 필요로 하는 것 같던데 그런 부분에서 도움이 될 것 같다.

제출 코드

import sys
n = int(sys.stdin.readline().rstrip())

def solv(time, length):
    hour = int(time[:2])
    minute = int(time[3:])
    t = int(length)
    cst = 0
    while(t > 0):
        if(t < 300):
            t -= 60
            cst += 1000
            hour = (hour+1)%24
        else: #300 이상이니까 야간 정액과 비교해야함
            if(hour >= 3 and hour < 21):
                t -= 60
                cst += 1000
                hour = (hour+1)%24
            else:
                if(hour == 21): #일반에서 전환
                    if(t > 360):
                        t -= (60-minute)
                        t -= 10*60
                        minute = 0
                        hour = 8
                        cst += 6000
                    else:
                        t -= 60
                        cst += 1000
                        hour = (hour+1)%24
                else: #중간 진입
                    cst += 5000
                    if(hour < 3):
                        t -= (7-hour)*60
                    else:
                        t -= (31-hour)*60
                    t -= (60-minute)
                    minute = 0
                    hour = 8
    return cst


for i in range(n):
    a, b = sys.stdin.readline().rstrip().split()
    print(solv(a,b))