본문 바로가기

ProgramSoliving

백준 : 1655

반응형

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

 

1655번: 가운데를 말해요

첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -10,000보다 크거나 같고, 10,000보다 작거나 같다.

www.acmicpc.net

문제는 MaxHeap Minheap을 만들어서 중앙값 왼쪽 오른쪽을 관리하는 것이다.

Maxheap   mid    Minheap 이런식으로 정렬은한다고 친다면 처음 받은 중앙값을 mid로 하고 관리하면된다.

이때 처음받은 값을 기준으로 그다음값이 mid 보다 크다면 Minheap에 넣어주고

작다면 Maxheap에 넣어준다. 이때 중앙값이기 때문에 Maxheap과 Minheap 사이즈가 중요하다 전체값이 홀수라는것은 Maxheap과 Minheap의 사이즈가 같을때이다.

만약 Maxheap이 1이 Minheap보다 더크다면 정답은 Maxheap의 맨위에값이다 이때는 따라서

mid값을 Minheap으로 옮겨주고 mid를 Maxheap값으로 갱신해준다.

이렇게되면 Maxheap은 항상 Minheap보다 같거나 1작은 상태이다.

만약 Minheap이 Maxheap보다 2크다면 이번에는 오른쪽에서 왼쪽으로 옮겨준다.

이렇게하면 Minheap 사이즈는 Maxheap보다 항상 1크거다 같다가 성립한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package day0301;
 
import java.util.Scanner;
 
public class B1655 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
 
        PriorityQueue<Integer> left = new PriorityQueue<Integer>(Comparator.reverseOrder());
        PriorityQueue<Integer> right = new PriorityQueue<Integer>();
 
        int mid = sc.nextInt();
 
        for (int n = 0; n < N - 1; n++) {
            System.out.println(mid);
 
            int tmp = sc.nextInt();
 
            if (mid < tmp) {
                right.add(tmp);
            } else {
                left.add(tmp);
            }
 
            // 오른쪽이 두개더만타면
            if (left.size() + 2 == right.size()) {
                left.add(mid);
                mid = right.poll();
            }else if (left.size() == right.size() + 1) {
                right.add(mid);
                mid = left.poll();
            }
 
        }
 
        System.out.println(mid);
 
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 3197  (0) 2020.03.01
Sqrt Decomposition  (0) 2020.03.01
백준 : 12865  (0) 2020.03.01
백준 : 5214  (0) 2020.03.01
백준 : 9328  (0) 2020.02.29