강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

김동욱님의 프로필 이미지
김동욱

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

4. 최대수입스케쥴( PriorityQueue)

최대수입스케쥴(PriorityQueue) 질문입니다.

작성

·

118

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

아래와 같이 코드를 작성하였을 때 예제에는 정상정답이 나오고, 저도 반례를 찾지 못하는데, 채점에서는 오답이라고 나옵니다.

어느부분이 오답인지, 그리고 반례가 뭐가 있을지 궁금합니다.ㅠㅠ

 

import java.util.*;



public class Main {

    public static class schedule implements Comparable<schedule>{
        int pay = 0;
        int day = 0;

        schedule(int p,int d) {
            this.pay = p;
            this.day = d;
        }

        @Override
        public int compareTo(schedule o) {
            if(this.day == o.day) return o.pay - this.pay;
            else return o.day - this.day;
        }
    }

    public void solution(List<schedule> list) {
        Collections.sort(list);
        int answer = 0;
        int day = list.get(0).day;
        Queue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());

        for(schedule s : list) {
            if(day == s.day) {
                queue.offer(s.pay);
            } else {
                if(!queue.isEmpty()) {
                    int p = queue.poll();
                    answer += p;
                }
                queue.offer(s.pay);
                day--;
            }

        }
        System.out.println(answer += queue.poll());

    }


    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);

        int n = kb.nextInt();
        List<schedule> list = new ArrayList<>();
        for(int i=0; i<n; i++) {
            int pay = kb.nextInt();
            int day = kb.nextInt();
            list.add(new schedule(pay, day));
        }

        T.solution(list);


    }
}

답변 1

1

안녕하세요, 인프런 AI 인턴입니다. 김동욱님,

주어진 문제에서 오답이 발생하는 부분을 찾기 위해 코드를 검토해 보겠습니다. schedule 클래스는 day를 우선하여 내림차순, pay를 기준으로 오름차순으로 정렬하도록 구현되어 있습니다. 이로 인해 다가올 여러 날짜(데이)에 대해 수입을 최대화하기 위한 전략에서 빈틈이 생길 수 있습니다.

오답이 발생하는 이유는 여러 날짜가 주어진 경우 모든 날 중 가장 큰 수입을 올릴 수 있는 전략을 우선하지 못하는 경우가 있습니다. 이를테면, PriorityQueue에 특정 일자에 여러 작업이 가능하더라도 정확히 최대 수입을 올릴 수 있는 차선책을 고를 수 없을 때 발생합니다.

수정 제안:
- Priority Queue를 사용하는 부분에서 가능한 모든 날짜에 대해 지금까지의 가장 큰 값을 선택하고 줄서기처럼 전략적으로 최대 수입을 얻을 수 있도록 로직을 조정하는 것이 필요합니다.
- 챌린지는 중점적으로 처리되지 않는 모든 날짜의 가능한 최대 수입을 넣고 비교한 후 해결하는 방법입니다.

예제를 실행할 부분에서 예제 이외의 추가 테스트 케이스를 만들어 보시는 것도 큰 도움이 될 수 있습니다. 이러한 예는 예기치 않은 시작 또는 종료 지점을 적게 고려하면 도움 될 수 있습니다.

이해에 도움이 되셨기를 바라며, 다른 질문이나 구체적인 부분에서 추가적인 도움이 필요하시다면 언제든지 질문해 주세요!
문제에 대해 다시 한 번 생각해 볼 수 있는 리소스도 권해 드립니다.

김동욱님의 프로필 이미지
김동욱

작성한 질문수

질문하기