[알고리즘 스터디 - 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))