λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
    <
Algorithm/Baekjoon

[λ°±μ€€] 1417번: κ΅­νšŒμ˜μ› μ„ κ±° (Java) / μš°μ„ μˆœμœ„ 큐

by yeeeh 2022. 2. 2.

πŸ“ 문제 링크

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

 

1417번: κ΅­νšŒμ˜μ› μ„ κ±°

첫째 쀄에 ν›„λ³΄μ˜ 수 N이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ 쀄뢀터 μ°¨λ‘€λŒ€λ‘œ 기호 1λ²ˆμ„ 찍으렀고 ν•˜λŠ” μ‚¬λžŒμ˜ 수, 기호 2λ²ˆμ„ 찍으렀고 ν•˜λŠ” 수, μ΄λ ‡κ²Œ 총 N개의 쀄에 걸쳐 μž…λ ₯이 λ“€μ–΄μ˜¨λ‹€. N은 50보닀 μž‘κ±°λ‚˜ κ°™

www.acmicpc.net

 

πŸ“ 문제 보기 (더보기 πŸ‘‡πŸ»)

 

πŸ“ λ¬Έμ œ μ ‘κ·Ό 

 

κ΅­νšŒμ˜μ› λ‹Ήμ„  쑰건이 λ‹€μ†œμ΄λ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν›„λ³΄μžλ“€μ˜ λ“ν‘œμˆ˜ 보닀 λ§Žμ•„μ•Ό ν•œλ‹€.

μš°μ„ μˆœμœ„ 큐λ₯Ό λ§Œλ“€μ–΄μ„œ λ‹€μ†œμ΄λ₯Ό μ œμ™Έν•œ ν›„λ³΄μžλ“€μ˜ λ“ν‘œ 수λ₯Ό λ„£μ—ˆλ‹€.

λ‹€μ†œμ΄μ˜ νˆ¬ν‘œμˆ˜κ°€ κ°€μž₯ 높을 λ•Œ κΉŒμ§€ μ•„λž˜μ˜ 과정을 λ°˜λ³΅ν•˜λ©΄ λœλ‹€.

 

1. 큐의 κ°€μž₯ μš°μ„ μˆœμœ„ κ°’(κ³  λ“ν‘œμž)κ³Ό λ‹€μ†œμ΄ ν‘œ 비ꡐ

2. κ³ λ“ν‘œμž -1 πŸ‘‰πŸ» λ‹€μ†œμ΄ ν‘œ, 맀수 횟수 +1 πŸ‘‰πŸ» κ³ λ“ν‘œμž-1 큐에 λ„£κΈ°

 

point ) 예제 μž…λ ₯ 3κ³Ό 같이 ν›„λ³΄μžμˆ˜κ°€ λ‹€μ†œμ΄ 혼자인 경우λ₯Ό κ³ λ €ν•΄μ•Ό ν•œλ‹€.

 

πŸ“ μ½”λ“œ 보기 (더보기 πŸ‘‡πŸ»)

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int t = Integer.parseInt(br.readLine()); // ν›„λ³΄μž 수
        // ν›„λ³΄μž ν‘œλ₯Ό 담을 μš°μ„ μˆœμœ„ 큐 생성(λ‚΄λ¦Όμ°¨μˆœ)
		PriorityQueue<Integer> candidate = new PriorityQueue<>(Collections.reverseOrder());
		int d = Integer.parseInt(br.readLine()); // λ‹€μ†œμ΄ ν‘œ
		int cand = 0; // λ‹€λ₯Έ ν›„λ³΄μžλ“€μ΄ 받은 ν‘œ
		int best = 0; // 졜고 μˆœμœ„μΈ ν‘œ 수
		int cnt = 0; // λ§€μˆ˜ν•œ 횟수

		for (int i = 0; i < t - 1; i++) {           
			cand = Integer.parseInt(br.readLine());
			candidate.add(cand);
		}

		if (t != 1) {                                // ν›„λ³΄μž μˆ˜κ°€ 1λͺ…이 μ•„λ‹Œ 경우
			while (d <= candidate.peek()) {      // λ‹€μ†œ <= κ³  λ“ν‘œμž 인 λ™μ•ˆ
				best = candidate.poll();       // κ³  λ“ν‘œμžλ₯Ό κΊΌλ‚΄μ„œ 
				best--;                        // νˆ¬ν‘œμˆ˜ 1을 κ°μ†Œ μ‹œν‚€κ³ 
				cnt++;                         // 맀수 횟수 1 증가
				d++;                           // λ‹€μ†œμ΄ ν‘œ 1 증가
				candidate.add(best);           // ν‘œκ°€ 1개 κ°μ†Œλœ ν›„λ³΄μžλ₯Ό λ‹€μ‹œ 큐에 λ„£κΈ°

			}
			System.out.println(cnt);
		} else {                              // ν›„λ³΄μž μˆ˜κ°€ 1λͺ…인 경우 맀수 횟수 0 좜λ ₯ 
			System.out.println(0);
		}

	}

}

 

πŸ“ μ½”λ“œ 풀이

reverseOrder(); λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•΄μ£ΌλŠ” λ©”μ„œλ“œ

peek(); κ°€μž₯ μš°μ„ μˆœμœ„μΈ 값을 μ½λŠ”λ‹€. λΉ„μ–΄μžˆλŠ” 경우 null을 λ°˜ν™˜. (νμ—μ„œ 제거 x)

poll(); κ°€μž₯ μš°μ„ μˆœμœ„μΈ 값을 읽고, νμ—μ„œ 제거. λΉ„μ–΄μžˆλŠ” 경우 null을 λ°˜ν™˜.

λŒ“κΈ€