Algorithm & Data Structures/BOJ

b.2696 쀑앙값 κ΅¬ν•˜κΈ°

Geisha 2025. 4. 7. 14:18

 

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

 

 

 

πŸ“Œ μžλ°”(Java)둜 ν‘ΈλŠ” μ€‘μ•™κ°’ κ΅¬ν•˜κΈ° - λ°±μ€€ 2696 πŸ”’

 


πŸ”Ž 문제 κ°œμš”

 

λ°±μ€€ 2696번 - 쀑앙값 κ΅¬ν•˜κΈ° λ¬Έμ œλŠ”

μ—¬λŸ¬ 개의 μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ,

각 μˆ˜μ—΄λ§ˆλ‹€ ν™€μˆ˜ 번째 수λ₯Ό μž…λ ₯받을 λ•Œλ§ˆλ‹€μ˜ 쀑앙값을 κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

 

  • μž…λ ₯ μˆ˜μ—΄μ˜ 개수: T
  • 각 μˆ˜μ—΄μ€ μ΅œλŒ€ 10μ”© λŠμ–΄μ Έ μž…λ ₯
  • ν™€μˆ˜ 번째 μˆ˜κ°€ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ 쀑앙값 좜λ ₯

 


πŸ’‘ 예제 μž…λ ₯

1
9
1 2 3 4 5 6 7 8 9

 

πŸ’‘ 예제 좜λ ₯

5
1 2 3 4 5

 

 


πŸ›  μ•Œκ³ λ¦¬μ¦˜ μ ‘κ·Ό 방식

 

이 λ¬Έμ œλŠ” λŒ€ν‘œμ μΈ 쀑앙값(Median) μœ μ§€ 문제둜,

**μ΅œλŒ€ νž™(μ™Όμͺ½ 절반) + μ΅œμ†Œ νž™(였λ₯Έμͺ½ 절반)**을 μ‚¬μš©ν•˜μ—¬ 쀑앙값을 효율적으둜 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

 

 

✏️ 핡심 아이디어

 

  • left: μ΅œλŒ€ νž™, 쀑앙값보닀 μž‘μ€ κ°’ μ €μž₯
  • right: μ΅œμ†Œ νž™, 쀑앙값보닀 큰 κ°’ μ €μž₯
  • 짝수 개 → left와 right κ· ν˜• μœ μ§€,
  • ν™€μˆ˜ 개 → leftκ°€ 항상 더 λ§Žλ„λ‘ μœ μ§€
  • ν™€μˆ˜ 번째 μˆ˜κ°€ λ“€μ–΄μ˜€λ©΄ left.peek()κ°€ 쀑앙값

 


πŸ”Ή Java μ½”λ“œ ν•΄μ„€

Queue<Integer> left = new PriorityQueue<>(Collections.reverseOrder()); // max heap
Queue<Integer> right = new PriorityQueue<>(); // min heap

βœ” left: 쀑앙값 μ΄ν•˜ 숫자

βœ” right: 쀑앙값 초과 숫자

 

if(left.isEmpty() || left.peek() < num){
    left.offer(num);
} else {
    right.offer(num);
}

βœ” μ²˜μŒμ—” left에 λ„£κ³ ,

βœ” 정렬을 μœ μ§€ν•˜κΈ° μœ„ν•΄ 두 νž™μ˜ μ‚¬μ΄μ¦ˆλ₯Ό 맞좰쀌

 

if (left.size() > right.size() + 1) {
    right.offer(left.poll());
} else if (right.size() > left.size()) {
    left.offer(right.poll());
}

βœ” νž™μ˜ 크기λ₯Ό **left ≥ right**κ°€ λ˜λ„λ‘ μœ μ§€

 

if(i % 2 == 0){
    answer++;
    sb.append(left.peek()).append(" ");
}

βœ” ν™€μˆ˜ 번째 μˆ˜κ°€ 듀어왔을 λ•Œλ§ˆλ‹€ left.peek() 좜λ ₯

βœ” μ΄λŠ” ν˜„μž¬ μž…λ ₯된 μˆ˜μ—΄μ˜ 쀑앙값

 

 

πŸ” μž…μΆœλ ₯ 처리

for(int i = 0; i < N; i += 10){
    input.append(br.readLine()).append(" ");
}

βœ” λ°±μ€€μ—μ„œ ν•œ 쀄에 μ΅œλŒ€ 10개의 숫자만 μ£Όμ–΄μ§€λ―€λ‘œ,

βœ” μ—¬λŸ¬ 쀄을 λ°›μ•„μ„œ ν•˜λ‚˜μ˜ 슀트링으둜 처리

 


πŸ† 정리

βœ… 핡심 포인트

 

βœ” 쀑앙값 λ¬Έμ œλŠ” 항상 **“두 개의 νž™”**을 생각

βœ” **μ™Όμͺ½(μ΅œλŒ€ νž™)**은 쀑앙값 μ΄ν•˜

βœ” **였λ₯Έμͺ½(μ΅œμ†Œ νž™)**은 쀑앙값 초과

βœ” left.peek()κ°€ 항상 쀑앙값이 λ˜λ„λ‘ μœ μ§€