728x90

문제)

 파풀라투스는 메이플스토리의 보스입니다.

 파풀라투스가 사용하는 패턴 중, 차원의 균열 봉인 패턴이 있습니다. 이 패턴이 시전되면, 6개의 영역으로 나뉘어진 파풀라투스 시계가 나타나게 됩니다.

[그림 1] 파풀라투스의 시계

 시침은 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시 방향 사이를 가리키고 있기 때문입니다.

[그림 2] 파풀라투스의 시계가 가리키는 시각을 바꾸는 아이템들

 아이템을 먹어서 파풀라투스의 시계가 가리키는 시각을 특정 시간만큼 증가시킬 수 있습니다. 예를 들어, 파풀라투스의 시계가 가리키는 시각이 11시 55분일 때, 10MIN 아이템을 먹는다면, 파풀라투스의 시계가 가리키는 시각은 11시 55분에서 10분 증가한 12시 05분이 됩니다.

[그림 3] 1번, 2번, 5번, 6번 영역이 봉인된 시계

 시침이 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함수를 이용하여 더 간략하게 정리가 가능하다.

+ Recent posts