https://www.acmicpc.net/problem/25239
문제
파풀라투스는 메이플스토리의 보스입니다.
파풀라투스가 사용하는 패턴 중, 차원의 균열 봉인 패턴이 있습니다. 이 패턴이 시전되면, 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 중 하나입니다.
풀이
문자열 처리 살짝하고, 구현 살짝하면 되는 문제이다.
메이플스토리를 좀 해봤다면 익숙할 듯하다.
코드
import java.io.*;
import java.util.*;
public class Main {
static int curTime;
static int[] hp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), ":");
curTime = Integer.parseInt(st.nextToken()) * 60 + Integer.parseInt(st.nextToken());
hp = new int[6];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 6; i++) {
hp[i] = Integer.parseInt(st.nextToken());
}
int L = Integer.parseInt(br.readLine());
for (int i = 0; i < L; i++) {
st = new StringTokenizer(br.readLine());
st.nextToken();
String command = st.nextToken();
execute(command);
}
int ans = 0;
for (int i = 0; i < 6; i++) {
ans += hp[i];
}
System.out.println((ans>100)? 100: ans);
}
static void execute(String command) {
if (command.equals("^")) {
if (curTime % 120 == 0) return;
hp[curTime/120] = 0;
} else if (command.charAt(2) == 'M') {
int tempTime = (command.charAt(0) - '0') * 10 + (command.charAt(1) - '0');
curTime = (curTime + tempTime) % 720;
} else {
int tempTime = (command.charAt(0) - '0') * 60;
curTime = (curTime + tempTime) % 720;
}
}
}
여담
만약 1번 영역부터 6번 영역까지 모두 100이 뜬다면 모든 칸을 제거하지 않으면 피가 100퍼센트 찬다! 꽤 번거로운 패턴이기에, 카오스 파풀라투스는 바인드컷하는게 속이 편하다.
'PS > Implementation' 카테고리의 다른 글
백준 4991번: 로봇 청소기 (Java) (0) | 2022.06.27 |
---|---|
백준 20057번: 마법사 상어와 토네이도 (Java) (0) | 2022.06.10 |
백준 20056번: 마법사 상어와 파이어볼 (JAVA) (0) | 2022.06.08 |
백준 17779번: 게리맨더링 2 (JAVA) (0) | 2022.06.01 |
백준 19238번: 스타트 택시 (JAVA) (0) | 2022.05.17 |