PS/Implementation

백준 25239번: 가희와 카오스 파풀라투스 (Java)

닻과매 2022. 6. 9. 11:22

https://www.acmicpc.net/problem/25239

 

25239번: 가희와 카오스 파풀라투스

차원의 균열 패턴이 끝난 후, 파풀라투스가 회복하는 체력이 h%라고 할 때, h를 출력해 주세요.

www.acmicpc.net

 

문제

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

파풀라투스가 사용하는 패턴 중, 차원의 균열 봉인 패턴이 있습니다. 이 패턴이 시전되면, 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퍼센트 찬다! 꽤 번거로운 패턴이기에, 카오스 파풀라투스는 바인드컷하는게 속이 편하다.