문제 풀이/백준

[백준]29791번. 에르다 노바와 오리진 스킬(JAVA)

27200 2024. 9. 4. 13:15

문제

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


풀이

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int countN = 1;
        int countM = 1;

        Queue<Integer> queue = new PriorityQueue<>();

        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < N; i++){
            queue.add(Integer.parseInt(st.nextToken()));
        }

        int lastSkillTime = queue.poll();
        int lastImmunityTime = lastSkillTime;
        for(int i = 1; i < N; i++){
            int tmp = queue.poll();
            if(tmp < lastSkillTime + 100){
                continue;
            }
            lastSkillTime = tmp;
            if(tmp >= lastImmunityTime + 90){
                countN++;
                lastImmunityTime = tmp;
            }
        }

        queue.clear();
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < M; i++){
            queue.add(Integer.parseInt(st.nextToken()));
        }
        lastSkillTime = queue.poll();
        lastImmunityTime = lastSkillTime;
        for(int i = 1; i < M; i++){
            int tmp = queue.poll();
            if(tmp < lastSkillTime + 360){
                continue;
            }
            lastSkillTime = tmp;
            if(tmp >= lastImmunityTime + 90){
                countM++;
                lastImmunityTime = tmp;
            }
        }

        System.out.println(countN + " " + countM);
    }


}

 

단순 구현 문제다. 우선순위 큐를 통해 스킬이 사용된 시점을 먼저 순서대로 정렬한다. 이 후 이를 하나씩 뽑아서 사용한다.

만약 스킬 쿨타임이 돌지 않았다면 continue를 통해 건너뛴다.

스킬 쿨타임이 돼서 사용이 가능하다면 면역 시간을 확인하고 결정한다.