빙응의 공부 블로그

[Programmers]LV.1 명예의 전당 본문

Argorithm

[Programmers]LV.1 명예의 전당

빙응이 2023. 12. 6. 22:07

 

 


📝풀이

컬렉션을 이용한 처리가 중요한 방식이다. 

나는 ArrayList를 이용해 구현했지만 

PriorityQueue를 이용하면 쉽게 구현 가능하다. 

 

1. k개의 용량을 다 채워줄 로직이 필요하다.

2. 값을 비교하기 위한 sort기능이 필요하다.

3. 맨 앞에 있는 값을 가져오기 위한 방법이 필요하다

 

내가 한 코드는 모든 경우의 수에 sort를 하며 remove때 많은 연산이 필요하다. 

import java.util.*;

class Solution {
    public int[] solution(int k, int[] score) {
        ArrayList<Integer> honor = new ArrayList<>();
        int[] answer = new int[score.length];

        for (int i = 0; i < score.length; i++) {
            if (i < k) {
                honor.add(score[i]);
            } else {
                if (honor.get(0) < score[i]) {
                    honor.remove(0);
                    honor.add(score[i]);
                }
            }
            Collections.sort(honor);
            answer[i] = honor.get(0);
        }

        return answer;
    }
}

 

 

그래서 PriorityQueue를 이용한다. 

PriorityQueue는 우선순위가 있는 큐이다.

즉 자동으로 sort 기능이 있다. 

이 방법을 이용하면 효율적인 코딩이 가능하다.

import java.util.*;

class Solution {
    public int[] solution(int k, int[] score) {
        PriorityQueue<Integer> honor = new PriorityQueue<>();
        int[] answer = new int[score.length];

        for (int i = 0; i < score.length; i++) {
            if (i < k) {
                honor.add(score[i]);
            } else {
                if (honor.peek() < score[i]) {
                    honor.poll();
                    honor.add(score[i]);
                }
            }
            answer[i] = honor.peek(); //큐의 맨앞을 가져옴
        }

        return answer;
    }
}