[Heap] 이중우선순위큐

서은경·2022년 5월 13일
0

CodingTest

목록 보기
14/71
public static int[] solution(String[] operations) {
        int[] answer = {};

        int max = 0;
        int min = 0;
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        PriorityQueue<Integer> pq2 = new PriorityQueue<>();

        for (int i = 0; i < operations.length; i++) {
            List<String> list = Arrays.asList(operations[i].split(" "));
            //System.out.println(list.get(0)+" "+list.get(1));

            if (list.get(0).equals("I")) {
                pq.add(Integer.valueOf(list.get(1)));
            } else {

                int cnt = 0;
                if(pq.isEmpty()) continue;
                Iterator<Integer> it = pq.iterator();

                if (Integer.valueOf(list.get(1)) < 0) {
                    // 최소값 제거
                    while (!pq.isEmpty()) {
                        pq2.add(pq.poll());
                    }
                    pq2.poll();
                    while (!pq2.isEmpty()) {
                        pq.add(pq2.poll());
                    }

                } else {
                    // 최대값 제거
                    pq.poll();
                }
            }
        }

        int cnt = 0;
        while (!pq.isEmpty()) {
            if(cnt == 0 ) {
                max = pq.poll();
            } else {
                min = pq.poll();
            }
            cnt++;
        }

        answer = new int[]{max, min};
        System.out.println(max+" "+min);
        return answer;
    }

Arrays.asList()
배열을 arrayList로 변환하여 리턴

String[] split(String regex)
입력받은 정규표현식 또는 특정문자를 기준으로 문자열을 나누어 배열로 리턴

아직 어디 내놓기 부끄러운 코드 ... 일단 들어온 값을 띄어쓰기 기준으로 잘라주어 원소 삽입인지 삭제인지 구분하고, 큐 두개를 만들어 poll로 최소/최대값 삭제할 수 있도록 했다
근데 다 짜고보니 저 while문 두개가 넘 보기싫고 성능적으로 안좋을 것 같아서 다른 사람들 풀이를 좀 봤는데 오름차순 큐 하나, 내림차순 큐 하나 만들어서 둘다 담아주고 poll 로 값 뺀 후 맨 마지막에 각각의 큐에 가장 첫번째값만 가져왔다
왜 그렇게 못풀었을까 난 !!!!!! 암튼 담번엔 쉽게 풀어야지

0개의 댓글

관련 채용 정보