Solution 1) 내 풀이
import java.util.ArrayList;
import java.util.List;

class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        List<Integer> list = new ArrayList<>();
        int a = 0;
        int b = 0;
        int c = 0;
        
        for (int i = 0; i < rank.length; i++) {
            if (attendance[i]) {
                list.add(rank[i]);
            }
        }
        list.sort(null);
        
        int cnt = 0;
        Loop : for (int item : list.stream().mapToInt(Integer::intValue).toArray()) {
            for (int i = 0; i < rank.length; i++) {
                if (item == rank[i] && cnt == 0) {
                    a = i;
                    cnt++;
                    continue Loop;
                } else if (item == rank[i] && cnt == 1) {
                    b = i;
                    cnt++;
                    continue Loop;
                } else if (item == rank[i] && cnt == 2) {
                    c = i;
                    cnt++;
                    break Loop;
                }
            }
        }
        return 10000 * a + 100 * b + c;
    }
}

 

Solution 2) 다른 사람의 풀이
import java.util.PriorityQueue;

class Solution {
    public int solution(int[] rank, boolean[] attendance) {

        PriorityQueue<Integer> que = new PriorityQueue<>((a, b) -> rank[a] - rank[b]);
        for (int i = 0; i < attendance.length; i++) {
            if (attendance[i])
                que.add(i);
        }

        return que.poll() * 10000 + que.poll() * 100 + que.poll();
    }
}

 

문제 및 코드 리뷰

학생별 순위 배열과 참석여부 배열이 있다. 참석한 학생 중 1, 2, 3순위를 가려 식에 맞춰 int 값을 반환하는 문제이다.

 

나는 그저 배열과 list를 이용해 풀어냈다. 그치만 다른 사람의 풀이를 보니 우선순위큐를 이용해 보다 간단하게 풀어낼 수 있었다.

PriorityQueue<Integer> que = new PriorityQueue<>((a, b) -> rank[a] - rank[b]); 문장을 보면 

(a, b) -> rank[a] - rank[b] 이 부분이 비교자(Comparator)가 된다. 

비교자에서 a는 idx 0번을 뜻하고 b는 나머지 idx를 순회하게 된다.

이를 비교했을 때 a - b가 음수라면 b가 a에 비하여 후순위를 뜻하며,

a - b가 양수라면 b가 a에 비해 선수위임을 뜻한다.

결국 그림과 같이 낮은 값이 선순위가 되어 반환하게 된다.

 

이를 이용해 반복문을 돌려 출석여부와 함께 비교해 que에 요소를 넣어 정렬을 진행한다.

이후 poll을 통해 정렬 돼 있는 수중 우선순위를 통해 가장 작은 수부터 차례대로 빼내오게 돼

정해진 수식에 대입 된다.

 

사용이 익숙치 않았던 우선순위큐를 공부해볼 수 있었다.

+ Recent posts