티스토리 뷰
[참고할만한 알고리즘 이론]
2019/02/16 - [알고리즘 이론] - 우선순위 큐와 힙
2019/02/16 - [알고리즘 이론] - [정렬] 힙 정렬
이 문제를 풀기 위해서 다음과 같은 조건을 수립합니다.
1) 입력받는 데이터들을 두 개의 힙으로 나누되 하나는 최소힙, 나머지 하나는 최대힙으로 구성한다.
2) 최대힙의 크기는 최소힙과 같거나 1만큼 크다.
3) 최대힙의 루트는 최소힙의 루트보다 작거나 같다.
예를 들어, 3, 1, 5, 4, 2의 순서로 데이터가 입력된다고 가정합니다.
1. 데이터 3이 입력되었을 때
1) maxHeap과 minHeap 크기가 같으므로 maxHeap에 저장합니다.
2. 데이터 1이 입력되었을 때
1) maxHeap의 크기와 minHeap크기가 다르므로 minHeap에 저장합니다.
2) maxHeap의 루트 데이터가 minHeap의 루트 데이터보다 크므로 두 데이터(1과 3)을 바꿔줍니다.
3. 1과 2를 반복합니다.
4. 모든 데이터를 위의 조건에 따라 힙에 저장한 뒤 maxHeap에 저장된 데이터가 중간 값입니다.
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static int tCase, N, a, b; public static void main(String[] args) throws Exception { tCase = Integer.parseInt(br.readLine()); for (int t = 0; t < tCase; t++) { StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); a = Integer.parseInt(st.nextToken()); b = Integer.parseInt(st.nextToken()); System.out.println(runningMedian(N, a, b)); } } public static Long runningMedian(int N, int a, int b) { Comparator<Long> maxComp = new Comparator<Long>() { @Override public int compare(Long o1, Long o2) { if (o1 > o2) return -1; else return 1; } }; Comparator<Long> minComp = new Comparator<Long>() { @Override public int compare(Long o1, Long o2) { if (o1 > o2) return 1; else return -1; } }; PriorityQueue<Long> maxHeap = new PriorityQueue<>(maxComp); PriorityQueue<Long> minHeap = new PriorityQueue<>(minComp); long seed = 1983; Long result = 0L; for (int i = 0; i < N; i++) { if (maxHeap.size() == minHeap.size()) maxHeap.offer(seed); else minHeap.offer(seed); if (!minHeap.isEmpty() && !maxHeap.isEmpty() && minHeap.element() < maxHeap.element()) { Long maxElement = maxHeap.poll(); Long minElement = minHeap.poll(); maxHeap.offer(minElement); minHeap.offer(maxElement); } seed = (seed * (long) a + b) % 20090711; result = (result + maxHeap.element()) % 20090711; } return result; } } | cs |
'알고리즘 문제 > 알고스팟' 카테고리의 다른 글
[알고스팟] 울타리 잘라내기 (분할정복) :: 늦깎이 IT (0) | 2019.03.21 |
---|---|
[알고스팟] 쿼드 트리 뒤집기 :: 늦깎이 IT (0) | 2019.03.21 |
[알고스팟] 여행하는 외판원1 :: 늦깎이 IT (0) | 2019.03.14 |
[알고스팟] 게임판 덮기 :: 늦깎이 IT (0) | 2019.03.14 |
[알고스팟] 소풍 :: 늦깎이 IT (0) | 2019.03.13 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 우선순위 큐
- 정렬
- SWEA
- 연산자 끼워넣기
- 리스트
- 14888
- 영역 구하기
- 최대힙
- 구현
- 알고리즘
- 브루트포스
- 시뮬레이션
- 나무 재테크
- DFS
- 삼성
- 힙정렬
- 백준
- 탐색
- 자바
- 힙
- 최소힙
- BFS
- 구슬 탈출2
- 배열
- 탈주범 검거
- 알고스팟
- 큐
- 트리
- 중간값
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함