일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- aspect-ratio
- 백준
- 백준java
- 백준문제풀이 #백준 #백준문제 #스타트택시
- 프로젝트초기설정
- 아두이노 우노
- 이친수문제
- 노마드코더
- 포인터
- ESP8266WiFi
- ESP8266
- ESP-01
- dp문제
- CSS
- CSS Flex
- 백준자바
- peap
- 백준풀이
- 2193
- reactNative
- ESP-01WiFi
- 연결리스트
- 백준15988풀이
- 리액트네이티브
- C
- scroll-snap
- Flexible box
- 백준 #백준2661 #좋은수열 #Java #코딩
- @supports
- scss
- Today
- Total
코딩 농장
[백준 7662번/JAVA] 이중 우선순위 큐 (문제 풀이, 코드) 본문
이중 우선순위 큐
[문제]
이중 우선순위 큐(dual priority queue)는 전형적인 우선순위 큐처럼 데이터를 삽입, 삭제할 수 있는 자료 구조이다. 전형적인 큐와의 차이점은 데이터를 삭제할 때 연산(operation) 명령에 따라 우선순위가 가장 높은 데이터 또는 가장 낮은 데이터 중 하나를 삭제하는 점이다. 이중 우선순위 큐를 위해선 두 가지 연산이 사용되는데, 하나는 데이터를 삽입하는 연산이고 다른 하나는 데이터를 삭제하는 연산이다. 데이터를 삭제하는 연산은 또 두 가지로 구분되는데 하나는 우선순위가 가장 높은 것을 삭제하기 위한 것이고 다른 하나는 우선순위가 가장 낮은 것을 삭제하기 위한 것이다.
정수만 저장하는 이중 우선순위 큐 Q가 있다고 가정하자. Q에 저장된 각 정수의 값 자체를 우선순위라고 간주하자.
Q에 적용될 일련의 연산이 주어질 때 이를 처리한 후 최종적으로 Q에 저장된 데이터 중 최댓값과 최솟값을 출력하는 프로그램을 작성하라.
[풀이]
Heap을 두 개 구현 하는 방법과 TreeMap을 사용하는 방법이 있다.
[내 코드 알고리즘]
Tree Map 을 사용하였다.
Treemap은 key를 기준으로 정렬된 자료구조이다. 같은 key 값을 가지는 데이터가 삽입될 경우, 덮어쓰기가 된다는 점을 유의하며 코드를 작성하면 해당 문제는 쉽게 해결된다.
char order 에는 'I'와 'D'를 구분할 문자를 담는다.
int val 에는 I일 경우엔 해당 값, D일 경우엔 1인지 -1인지 받아온다.
- 'I' 일 경우
treemap의 containskey(값) 내장함수를 사용하여 내가 넣으려는 키 값을 해당 트리에서 가지고 있는지 검사한다.가지고 있다면, value를 count처럼 생각하여 value를 하나 증가하여 삽입. 가지고 있지 않다면 그냥 삽입한다.
- 'D' 일 경우
1, 최대값을 삭제해야하는 경우.treemap은 오름차순 정렬이기 때문에 lastKey() 라는 내장함수를 사용하여 최대값을 변수에 담아준다.중복된 값이 있는지 확인을 위해 get(키값)이라는 내장함수를 이용하여 value를 가져온다.중복된 값이 있다면, value를 하나 줄이고 다시 집어넣기.없다면, 그냥 remove(키값) 내장함수를 이용하여 데이터를 삭제해준다.
-1, 최소값을 삭제하는 경우는 위의 경우에서 firstKey()만 이용하면 된다.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.TreeMap;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
TreeMap<Long, Long> map;
int T = Integer.parseInt(br.readLine()); // 테스트 케이스
for(int i=0; i<T; i++) {
int k = Integer.parseInt(br.readLine()); // 연산 개수
map = new TreeMap<>();
for(int j=0; j<k; j++) {
st = new StringTokenizer(br.readLine()," ");
char order =st.nextToken().charAt(0);
long val = Long.parseLong(st.nextToken());
if(order=='I') {
if(map.containsKey(val)) map.put(val, map.get(val)+1);
else map.put(val, 1L);
}
else if(order=='D') {
if(map.isEmpty()) continue;
if(val==1) {
long maxKey = map.lastKey();
long maxVal = map.get(maxKey)-1;
if(maxVal==0) map.remove(maxKey);
else map.put(maxKey, maxVal);
}
else if (val==-1) {
long minKey = map.firstKey();
long minVal = map.get(minKey)-1;
if(minVal==0) map.remove(minKey);
else map.put(minKey, minVal);
}
}
}
/* q의 최대 최소 출력 */
if(map.isEmpty()) System.out.println("EMPTY");
else System.out.println(map.lastKey()+" "+map.firstKey());
}
}
}
[난관]
나는 처음에 간단하게 PriorityQueue를 이용하려고 했다.
PQ를 두개 만들어서 하나는 최대값 전용, 하나는 최소값 전용으로 이용하려고 했으나, 시간 초과가 났다.
remove 내장함수도 있길래 얼씨구나 했는데.. 다른 분은 PQ로도 푼 것 같은데.왜 시간 초과가 났을까? 나중에 비교해보면서 알아봐야겠다.
또 문제를 잘못이해해서 많이 틀렸다.테스트 데이터를 T개 준다고 했을 때, 나는 이전의 값들을 유지시킨 채로 다음 테스트를 한다고 이해했다.그래서 Treemap을 초기화 안하고 사용하니 , 계속 틀렸습니다를 받게 되었다....다른 분들의 코드와 비교하면서 문제점을 찾을 수 있었다. ㅠㅠ
GitHub에 티스토리에 올리지 않은 코드들도 업로드 되어 있습니다.
github.com/MOBUMIN/BJalgorithm/blob/master/07000-07999/DoublePQ_7662.java
MOBUMIN/BJalgorithm
백준 알고리즘 푼 것. Contribute to MOBUMIN/BJalgorithm development by creating an account on GitHub.
github.com
'백준' 카테고리의 다른 글
[백준 1261번/JAVA] 알고스팟 (문제 풀이, 코드) (0) | 2021.01.11 |
---|---|
[백준 10451번/JAVA] 순열 사이클 (문제 풀이, 코드) (0) | 2020.12.06 |
[백준 15988번/JAVA] 1, 2, 3 더하기 3 (문제 풀이, 코드) (0) | 2020.11.21 |
[백준 1958번/JAVA] LCS3 (문제 풀이, 코드) (0) | 2020.09.27 |
[백준 1516번/JAVA] 게임 개발 (문제 풀이, 코드) (0) | 2020.09.26 |