티스토리 뷰

반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12987

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

# 힌트

우선순위 큐. 참고로 DFS로 접근하면 입력 크기가 10만이기 때문에 안 된다.

 

해답 보기

더보기

문제 풀이의 핵심 아이디어는 B는 A보다 크고 B가 가지고 있는 수 중 제일 작은 수로 이겨야 한다는 점이다.

즉, A = 3 이고 B = 4,5이면 B는 4로 이겨야 한다.

 

각 배열를 역순으로 정렬한다.

A = [7,5,3,1]

B = [8,6,2,2]

7, 8 비교 7 < 8 이므로 win + 1

5 < 6 이므로 win + 1

3 < 2 는 아니므로 넘어간다. 

1 < 2 이므로 win + 1

 

이를 우선순위 큐를 사용해서 구현하면 다음과 같은 로직을 따른다.

1. 역순 정렬인 우선순위 큐에 A, B 각각의 원소를 넣는다.

2. A의 길이 (B의 길이와 동일) 만큼 다음을 반복

2-1. A 큐와 B 큐에서 각각 원소를 꺼내서 비교한다.

2-2. A < B 이면 win + 1

2-3  A >= B 이면 꺼낸 B를 다시 B 큐에 집어넣는다.

3. win return

 

2-3 번은 B가 가지고 있는 수 중 A보단 크지만 가장 작은 수를 다시 우선순위 큐에서 꺼낼 수 있도록 하기 위해 다시 넣어주는 것이다.

 

    static PriorityQueue<Integer> getQueue(int[] arr) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());
        for (int n : arr) pq.add(n);
        return pq;
    }

    public static int solution(int[] A, int[] B) {
        PriorityQueue<Integer> aq = getQueue(A);
        PriorityQueue<Integer> bq = getQueue(B);
        int win = 0;
        for (int i = 0; i < A.length; i++) {
            int a = aq.poll();
            int b = bq.poll();
            if (a < b) win++;
            else bq.add(b);
        }
        return win;
    }

 

반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크