문제)
파풀라투스는 메이플스토리의 보스입니다.
파풀라투스가 사용하는 패턴 중, 차원의 균열 봉인 패턴이 있습니다. 이 패턴이 시전되면, 6개의 영역으로 나뉘어진 파풀라투스 시계가 나타나게 됩니다.
시침은 12시 방향에서 2시 방향 사이를 가리킬 때 1번 영역에, 2시에서 4시 사이를 가리킬 때 2번 영역에, 4시 방향에서 6시 방향 사이를 가리킬 때 3번 영역에, 6시 방향에서 8시 방향 사이를 가리킬 때 4번 영역에, 8시 방향에서 10시 방향 사이를 가리킬 때 5번 영역에, 10시 방향에서 12시 방향 사이를 가리킬 때 6번 영역에 있습니다. 시침이 정확히 2, 4, 6, 8, 10, 12시를 가리키는 경우는 고려하지 않습니다.
그림 1에서 시침은 6번 영역에 있습니다. 파풀라투스의 시계는 약 11시 55분이고, 이때 시침은 10시 방향과 12시 방향 사이를 가리키고 있기 때문입니다.
아이템을 먹어서 파풀라투스의 시계가 가리키는 시각을 특정 시간만큼 증가시킬 수 있습니다. 예를 들어, 파풀라투스의 시계가 가리키는 시각이 11시 55분일 때, 10MIN 아이템을 먹는다면, 파풀라투스의 시계가 가리키는 시각은 11시 55분에서 10분 증가한 12시 05분이 됩니다.
시침이 x번 영역에 있을 때, 유저가 시계 왼쪽 포탈에서 윗키를 누르면, x번 영역이 봉인됩니다. 차원의 균열 패턴이 시전되고 1분이 지난 후, 봉인되지 않은 칸이 있다면, 그 칸들에 쓰여 있는 % 수치의 합만큼 체력을 회복하게 됩니다. 이때, % 수치의 합이 100을 넘어간다면 100%만큼 회복합니다. 만약, 1분이 지나기 전에 6개의 칸이 모두 봉인되었다면, 남은 시간과 관계 없이 패턴이 종료됩니다.
차원의 균열 패턴이 시전되고 난 후 가희가 플레이한 이벤트가 주어졌을 때, 패턴이 끝나고 파풀라투스는 몇 %의 체력을 회복할 수 있는지 구해 주세요.
입력)
첫 번째 줄에 차원의 균열 패턴이 시전되었을 때, 파풀라투스의 시계가 가리키고 있는 시각이 hh:mm 형식으로 주어집니다.
두 번째 줄에는 1번 영역에 써져 있는 수부터 6번 영역에 써져 있는 수까지 공백으로 구분되어 주어집니다.
세 번째 줄에 이벤트의 수 L이 주어집니다.
다음 L개의 줄에는 발생한 이벤트 목록이 시간 순서대로 주어집니다. 이벤트 목록에 대한 형식은 아래와 같습니다.
- s.T ^
- 게임 시간 s.T초에 가희가 시계 왼쪽 포탈에서 키보드 위쪽 키를 누릅니다.
- s.T 10MIN
- 게임 시간 s.T초에 가희가 10MIN 아이템을 먹습니다.
- s.T 30MIN
- 게임 시간 s.T초에 가희가 30MIN 아이템을 먹습니다.
- s.T 50MIN
- 게임 시간 s.T초에 가희가 50MIN 아이템을 먹습니다.
- s.T 2HOUR
- 게임 시간 s.T초에 가희가 2HOUR 아이템을 먹습니다.
- s.T 4HOUR
- 게임 시간 s.T초에 가희가 4HOUR 아이템을 먹습니다.
- s.T 9HOUR
- 게임 시간 s.T초에 가희가 9HOUR 아이템을 먹습니다.
s.T 포맷에서 s는 0 이상의 정수로 주어지며, T는 0 이상 999 이하의 정수로 주어집니다. 이때 T가 두 자릿수라면 T 앞에 0 이, 한 자릿수라면 T 앞에 00 이 붙습니다. 이는, 게임 시간 s+T×10-3초를 의미합니다.
출력)
차원의 균열 패턴이 끝난 후, 파풀라투스가 회복하는 체력이 h%라고 할 때, h를 출력해 주세요.
제한)
- 1 ≤ L ≤ 150
- 차원의 균열 봉인 패턴 외에 다른 패턴들 (집게 패턴, 레이저 패턴 등)은 무시합니다.
- hh:mm 형식에서 hh는 0보다 크거나 같고 11보다 작거나 같은 정수이고, mm은 0보다 크거나 같고 59보다 작거나 같은 정수입니다. hh, mm은 10보다 작은 경우 앞에 0이 붙으며, mm은 10의 배수가 아닙니다.
- 같은 시각에 둘 이상의 이벤트가 주어지지 않으며, 이벤트는 발생한 시간 순으로 주어집니다.
- 차원의 균열 봉인 패턴이 끝난 이후의 이벤트는 주어지지 않습니다.
- 파풀라투스 시계의 칸에 쓰여 있는 수는 1, 10, 100 중 하나입니다.
from sys import stdin
s = stdin.readline
def time_area(hh, mm):
ang = hh * 15 + (mm * 25) * 0.01
area = ang // 30
return int(area)
hh, mm = map(int, input().split(':'))
heal = list(map(int, input().split()))
event = int(input())
for _ in range(event):
s_T, command = map(str, s().rstrip().split())
if command == '^': heal[time_area(hh, mm)] = 0
elif command == '10MIN': hh, mm = (hh + (mm + 10) // 60) % 12, (mm + 10) % 60
elif command == '30MIN': hh, mm = (hh + (mm + 30) // 60) % 12, (mm + 30) % 60
elif command == '50MIN': hh, mm = (hh + (mm + 50) // 60) % 12, (mm + 50) % 60
elif command == '2HOUR': hh = (hh + 2) % 12
elif command == '4HOUR': hh = (hh + 4) % 12
elif command == '9HOUR': hh = (hh + 9) % 12
print(min(sum(heal), 100))
풀이 : 이번 문제를 해결하기 위해서는 '시침'이 어느 구간에 있는지를 구하는 것이 핵심이다. 구간을 구할 때에는 각도를 사용하였다. 시(hh)를 이용한 각도 + 분(mm)을 이용한 각도 = 시침의 각도 이다. 시침은 1시간마다 15도씩 움직이고, 1분마다 0.25도씩 움직인다. 이를 이용하여 시침의 각도를 구할 수 있다. 시침의 각도를 구한 뒤 시침이 어느 구간에 있는지를 구해야하는데 구간의 범위가 2시간씩 이므로 각도를 30으로 나누어 주었을 때 몫이 해당 구간임을 알 수 있다. 이렇게 해당 시각에 시침이 어느 구간에 있는지를 구하였다면 그 뒤는 입력값에 따른 결과를 출력해주면된다.
마지막에 결과값을 출력할 때 남아있는 체력 회복량이 100%이상일 경우 100을 출력하여야 하므로 if문을 사용해도 되지만 min함수를 이용하여 더 간략하게 정리가 가능하다.
'코딩 공부 > 파이썬' 카테고리의 다른 글
백준) 10814 - 나이순 정렬 [파이썬3] (0) | 2022.07.12 |
---|---|
백준) 24523 - 내 뒤에 나와 다른 수 [파이썬3] (0) | 2022.07.10 |
백준) 9375 - 패션왕 신해빈 [파이썬3] (0) | 2022.07.05 |
백준) 25306 - 연속 XOR [파이썬 3] (0) | 2022.07.03 |
백준) 25286 - 11월 11일 [파이썬 3] (0) | 2022.07.03 |