가운데를 말해요 1655번 [9일차]
시간제한 | 메모리 제한 |
0.1 초 | 128MB |
문제
백준이는 동생에게 "가운데를 말해요" 게임을 가르쳐주고 있다. 백준이가 정수를 하나씩 외칠때마다 동생은 지금까지 백준이가 말한 수 중에서 중간값을 말해야 한다. 만약, 그동안 백준이가 외친 수의 개수가 짝수개라면 중간에 있는 두 수 중에서 작은 수를 말해야 한다.
예를 들어 백준이가 동생에게 1, 5, 2, 10, -99, 7, 5를 순서대로 외쳤다고 하면, 동생은 1, 1, 2, 2, 2, 2, 5를 차례대로 말해야 한다. 백준이가 외치는 수가 주어졌을 때, 동생이 말해야 하는 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -10,000보다 크거나 같고, 10,000보다 작거나 같다.
출력
한 줄에 하나씩 N줄에 걸쳐 백준이의 동생이 말해야 하는 수를 순서대로 출력한다.
나의코드
package day9;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class Solution6 {
// 가운데를 말해요 - 1655번
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
//첫번째 줄
int N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a,b)-> b-a);
// 외칠때마다 중간수를 말해야함
for(int i=0;i < N;i++){
int M = Integer.parseInt(br.readLine());
// 큐에 저장
// 무조건 minHeap이 크거나 같아야함
// 짝수일때는 더 작은 값을 출력해야하기 때문에
if(maxHeap.size() <= minHeap.size()){
maxHeap.offer(M);
}else{
minHeap.offer(M);
}
// 탐색
// 무조건 minHeap은 들어가있음
// max의 제일 작은 값이
// min의 제일 큰값 보다 크다면 두 수를 바꿔야함
if(!minHeap.isEmpty() && maxHeap.peek() > minHeap.peek()){
int maxRoot = maxHeap.poll();
int minRoot = minHeap.poll();
maxHeap.add(minRoot);
minHeap.add(maxRoot);
}
sb.append(maxHeap.peek()).append("\n");
}
System.out.println(sb.toString());
}
}
문제해결
우선순위 큐를 사용해야하지만,
우선순위 큐는 중간값을 찾기 어렵기 때문에
최대힙과 최대힙 두가지를 사용해서 문제를 해결할수 있다
예시1)
7
[1, 5 , 2 , 10, -99, 7, 5]
maxHeap = [2,1,-99]
minHeap = [5,5,7,10]
1. 큐에 저장
큐에 저장되는 숫자가 짝수일 경우 중간값에서 더 작은수를 출력해야하기 때문에
무조건 minHeap에 들어있는 수가 같거나 많아야한다
2. 탐색
순서대로 저장된 힙에서 두 수를 비교해
max의 제일 작은 값 > min의 제일큰값
두수를 교체해줘야함
3. 출력
maxHeap에 최소값이 min의 최대값보다 작기 때문에 maxHeap.peek() 해준다
'Algorithm > 코딩테스트' 카테고리의 다른 글
[코딩테스트] 백준 - Yangjojang of The Year (0) | 2024.07.29 |
---|---|
[코딩테스트] 백준 - 일곱 난쟁이 (0) | 2024.07.29 |
[코딩테스트] 백준 - 패션왕 신해빈 (0) | 2024.07.27 |
[코딩테스트] 백준 - 크리스마스 선물 (2) | 2024.07.27 |
[코딩테스트] 백준 - 최소 힙 (0) | 2024.07.27 |