본문 바로가기
알고리즘 문제풀이/백준

[백준 1655] 가운데를 말해요

by m2162003 2021. 1. 14.

www.acmicpc.net/problem/1655

 

1655번: 가운데를 말해요

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

www.acmicpc.net

중간값 찾기 알고리즘을 사용한다.

 

maxHeap과 minHeap이 필요해서 우선순위큐를 사용한다.

두 힙은 다음과 같은 규칙을 따른다.

 

1. maxHeap은 minHeap의 크기와 같거나 1만큼 크다.

2. maxHeap의 탑은 minHeap의 탑보다 작거나 같다. 만약 이를 만족시키지 못하면 둘을 바꾼다.

 

이렇게 하면 maxHeap의 탑이 항상 중간값임을 알 수 있다. 신기방기..

 

예제에 적용하면 (오른쪽이 maxHeap이다.)

1: [] [1]

2: [5] [1]

3: [5] [2, 1]

4: [10, 5] [2, 1]

5: [10, 5] [2, 1, -99]

6: [10,7,5] [2,1,-99]

7: [10,7,5] [5,2,1,-99]

 

이렇게 된다.

 

#include <stdio.h>
#include <queue>

using namespace std;
int n;
priority_queue<int> maxHeap;
priority_queue<int, vector<int>, greater<int>> minHeap;
int main(void)
{
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
  {
    int tmp;
    scanf("%d", &tmp);

    if (maxHeap.size() <= minHeap.size())
    {
      maxHeap.push(tmp);
    }
    else
    {
      minHeap.push(tmp);
    }

    if (!maxHeap.empty() && !minHeap.empty())
    {
      int max = maxHeap.top();
      int min = minHeap.top();
      if (max > min)
      {
        maxHeap.pop();
        minHeap.pop();
        maxHeap.push(min);
        minHeap.push(max);
      }
    }

    printf("%d\n", maxHeap.top());
  }
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1080] 행렬  (0) 2021.01.24
[백준 1520] 내리막 길  (0) 2021.01.23
[백준 17298] 오큰수  (0) 2021.01.14
[백준 13305] 주유소  (0) 2021.01.14
[백준 9184] 신나는 함수 실행  (0) 2021.01.13

댓글