우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/바킹독

[JAVA] λ°±μ€€ 1655번 【G2.κ°€μš΄λ°λ₯Ό λ§ν•΄μš”γ€‘

2023. 9. 8. 13:11

문제

 

1655번: κ°€μš΄λ°λ₯Ό λ§ν•΄μš”

첫째 μ€„μ—λŠ” 백쀀이가 μ™ΈμΉ˜λŠ” μ •μˆ˜μ˜ 개수 N이 μ£Όμ–΄μ§„λ‹€. N은 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. κ·Έ λ‹€μŒ N쀄에 κ±Έμ³μ„œ 백쀀이가 μ™ΈμΉ˜λŠ” μ •μˆ˜κ°€ μ°¨λ‘€λŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. μ •μˆ˜λŠ” -1

www.acmicpc.net

 


풀이

1️⃣ μš°μ„  μˆœμœ„ 큐 λ‘κ°œλ₯Ό ν™œμš©ν•œ 풀이

πŸ’‘ λ– μ˜€λ₯Έ Idea

μš°μ„  μˆœμœ„ νλŠ” 이진 νž™ λ°©μ‹μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ 있기 λ•Œλ¬Έμ—, μ‚¬μš©ν•˜λ©΄ 정렬을 μœ μ§€ν•œ μ‚½μž… 과정을 O(logN) 에 μˆ˜ν–‰ν•  수 μžˆλ‹€.

그리고, μš°μ„  μˆœμœ„ 큐에 따라 μ •λ ¬λœ 데이터λ₯Ό κΊΌλ‚Ό λ•Œ μ—­μ‹œ, O(logN) 둜 μˆ˜ν–‰ν•  수 μžˆλ‹€.

λ”°λΌμ„œ μš°μ„  μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό λ§Œμ‘±μ‹œν‚¬ 수 μžˆλ‹€κ³  νŒλ‹¨ν•˜μ˜€λ‹€.


κ°€μš΄λ° 수λ₯Ό 항상 말해야 ν•˜λ―€λ‘œ,

λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬λœ μš°μ„ μˆœμœ„ 큐 (left) 와 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λœ μš°μ„  μˆœμœ„ 큐(right) 2개λ₯Ό ν™œμš©ν•œλ‹€.

left μ—λŠ” μ§€κΈˆκΉŒμ§€ 백쀀이가 μ™ΈμΉœ 수의 개수 쀑 λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ ˆλ°˜μ„ 넣을 것이고 

right μ—λŠ” λ‚˜λ¨Έμ§€ μˆ˜λ“€μ„ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 넣을 것이닀.

그리고 맀번 left 의 peek() ν–ˆμ„ λ•Œ λ‚˜μ˜¨ 수λ₯Ό λ°˜ν™˜ν•˜λ©΄ λœλ‹€.

백쀀이가 수λ₯Ό 외쳀을 λ•Œ

1. left 큐가 λΉ„μ–΄μžˆλŠ” 경우 
  → left 큐에 일단 μ‚½μž…ν•œλ‹€. μ΄μœ λŠ” μ›μ†Œκ°€ ν•œκ°œμΌ λ•Œ, left 의 peek ν•œ 값이 κ°€μš΄λ° 값이 λœλ‹€.

2. κ·Έ μ™Έ, 경우
 → 백쀀이가 λΆ€λ₯Έ μˆ˜κ°€ left 큐의 μ΅œλŒ“κ°’λ³΄λ‹€ μž‘μœΌλ©΄ left 큐에 λ„£κ³  크닀면 right 큐에 λ„£λŠ”λ‹€.

3. 백쀀이가 수λ₯Ό λΆ€λ₯΄κ³  λ‚˜μ„œ 2번 과에 따라 큐에 집어넣은 ν›„
→ left 큐의 크기가 right 큐의 크기 +1 μ΄μƒμœΌλ‘œ λ°”κΏ”μ€€λ‹€.

ex) left = [ 3 ] , right = [  ]  , λΆ€λ₯Έ 수 =  2

→ left = [ 2, 3 ] , right = [ ] 

→ 3번 κ³Όμ • 거치기

→ left = [ 2 ] , right = [ 3 ]

4. μœ„ 과정을 거치고 left 의 peek 값을 λ°˜ν™˜ν•˜λ©΄ κ°€μš΄λ° 값이 λœλ‹€.

 

 

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));

        int N = Integer.parseInt(br.readLine());

        PriorityQueue<Integer> left = new PriorityQueue<>((a, b) -> b - a);
        PriorityQueue<Integer> right = new PriorityQueue<>();

        StringBuilder ans = new StringBuilder();

        while (N-- > 0) {
            int n = Integer.parseInt(br.readLine());
			
            // left 큐가 λΉ„μ–΄μžˆμœΌλ©΄ left 큐에 μΆ”κ°€
            if (left.isEmpty()) {
                left.offer(n);
            } else {
                Integer maxOfLeft = left.peek();
				
                // left 큐의 μ΅œλŒ“κ°’λ³΄λ‹€ μž‘μœΌλ©΄ left 큐에 μΆ”κ°€
                if (maxOfLeft >= n) {
                    left.offer(n);
                // left 큐의 μ΅œλŒ“κ°’λ³΄λ‹€ 크면 right 큐에 μΆ”κ°€    
                } else {
                    right.offer(n);
                }
            }
			
            // left 큐와 right 큐 재배치
            arrangeQueueSize(left, right);

            ans.append(left.peek() + "\n");
        }

        System.out.println(ans);
    }

    private static void arrangeQueueSize(PriorityQueue<Integer> left, PriorityQueue<Integer> right) {
        int sizeOfLeft = left.size();
        int sizeOfRight = right.size();

		// μ™Όμͺ½ 큐 보닀 였λ₯Έμͺ½ 큐가 더 큰 경우, μ™Όμͺ½ 큐둜 이동
        if (sizeOfLeft < sizeOfRight) {
            left.offer(right.poll());
        } else {
        	// μ™Όμͺ½ 큐가 였λ₯Έμͺ½ 큐 크기 + 1 보닀 큰경우 였λ₯Έμͺ½ 큐둜 이동
            if (sizeOfLeft > sizeOfRight + 1) {
                right.offer(left.poll());
            }
        }
    }
}

 

 

κ²°κ³Ό

 

논리λ₯Ό 잘 μ„Έμš°κ³  그에 맞좰 κ΅¬ν˜„μ„ ν–ˆλ”λ‹ˆ 잘 ν•΄κ²°ν•  수 μžˆμ—ˆλ˜ 것 κ°™λ‹€.

    'πŸ‘¨πŸ»‍πŸ’» PS/바킹독' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [JAVA] λ°±μ€€ 2660번 【G5.회μž₯뽑기】
    • [JAVA] λ°±μ€€ 1781번 【G2.컡라면】
    • [JAVA] λ°±μ€€ 1715번 【G4.μΉ΄λ“œ μ •λ ¬ν•˜κΈ°γ€‘
    • [JAVA] λ°±μ€€ 23326번 【G3.홍읡 νˆ¬μ–΄λ¦¬μŠ€νŠΈγ€‘
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”