Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Archives
Today
Total
관리 메뉴

Life Engineering

[프로그래머스] 이중 우선순위 큐 (Java) 본문

Problem Solving

[프로그래머스] 이중 우선순위 큐 (Java)

흑개 2022. 3. 17. 14:06

https://programmers.co.kr/learn/courses/30/lessons/42628

 

코딩테스트 연습 - 이중우선순위큐

 

programmers.co.kr

import java.util.*;

class Solution {
    public int[] solution(String[] operations) {
        int[] answer;
        LinkedList<Integer> q=new LinkedList<>();
        for (int i=0; i<operations.length; i++){
            char c=operations[i].charAt(0);
            int num=Integer.parseInt(operations[i].substring(2));
            if (c=='I'){
                q.add(num);
            }
            else if (c=='D'){
                if (q.size()==0) continue;
                Collections.sort(q);
                if (num==1){
                    q.removeLast();
                }
                else if (num==-1){
                    q.removeFirst();
                }
            }
        }
        if (q.size()==0){
            answer=new int[]{0,0};
        }
        else{
            Collections.sort(q);
            answer=new int[]{q.peekLast(), q.peekFirst()};
        }
        return answer;
    }
}

링크드리스트를 이용해서, 뽑을 때 그것을 정렬하여 최소면 앞에 있는 것을 뽑고=>최대면 뒤에 있는 것을 뽑는 식으로 진행했다.

그런데 정석 풀이는 아닌 것 같다.

 

다른 분의 코드를 보니,

큐를 최소 큐, 최대 큐 2개를 만들어서 최소 큐 아이템을 뽑았을 때 최대 큐에서도 그 아이템을 remove 해준다.

최대 큐 아이템을 뽑았을 때도 마찬가지로 진행해준다.

그렇게 하면 O(nlogn) 으로 할 수 있다!

remove() 함수를 기억할것. remove() 함수도 O(logn) 이다. 

'Problem Solving' 카테고리의 다른 글

[BOJ 2565] 전깃줄 (Java)  (0) 2022.03.17
[BOJ 2638] 치즈 (Java)  (0) 2022.03.17
[프로그래머스] 기지국 설치 (Java)  (0) 2022.03.17
[BOJ 9935] 문자열 폭발 (Java)  (0) 2022.03.16
[프로그래머스] 경주로 건설 (Java)  (0) 2022.03.16