제이슨의 개발이야기

[코딩테스트] 프로그래머스 프린터 Java level2 본문

코딩테스트

[코딩테스트] 프로그래머스 프린터 Java level2

제이쓰은 2021. 6. 2. 01:00
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

안녕하세요... 현재시간 오전 12시48분.. 저는 방금 프로그래머스 에서 프린터 문제를 풀었습니다.... 아니 풀었다고 할 수 없습니다

저는 이 문제를 처음에 mergeSort 로 정렬한 다음에 위치를 찾으려고 몇일 온갖노력을 다했고 그게 여의치 않아서 다른 방식으로 풀려고 노력했지만 .... 결국 풀지 못했고 아무리 생각해도 모르겠어서 결국 구글링을 도움을 받아버렸습니다..ㅠㅠㅠ 

그렇다고 해서 정답을 그대로 복사 붙어넣기 하진않았습니다..,

아 전 아직 더 열심히 해야겠네요 ㅠㅠ 

 

문제 설명하기 앞서 혹시 Merge Sort 나 Quick Sort 로 푸신 분 게시나요?? 저는 여전히 이러한 Sort 방식으로 문제를 푸는것이 더 빠르고 효율적이라고 생각하고 있는대... 혹시 푸신분은 댓글남겨주시면 넘 감사하고 Sort 로는 찾을수 없는 이유를 아시는분 역시 댓글 달아주시면 감사합니다! 

 

문제 설명

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다.

예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.

내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.

현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

입출력 예

 

priorities location return
[2, 1, 3, 2] 2 1
[1, 1, 9, 1, 1, 1] 0 5

 

import java.util.Comparator;
import java.util.PriorityQueue;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer= 1;
        int  num = 0;
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Comparator.reverseOrder());
        for(int  i : priorities){
            priorityQueue.offer(i);
        }

        while(!priorityQueue.isEmpty()){
            for(int  i = 0; i<priorities.length;i++){
                if(priorities[i]==priorityQueue.peek()) {
                    if (i == location) {
                        return answer;
                    }
                    priorityQueue.poll();
                    answer++;
                }
            }
        }
        return answer;
    }
}

 

구글링을 통해서 먼저 정답을 봤을 때 먼저 봤던 것은 PriorityQueue 였습니다 

저 역시 이 우선순위 큐 를 알고 있었지만 중요한것은 생성자에 Comparator.reverseOrder()를 넣는것이였습니다

Comparator.reverseOrder()를 넣으면 내림차순으로 정렬이 됩니다 저는 요번 문제를 통해 이러한 것이 있었다는 것을 첨 알았습니다

그리고 같은 숫자 인경우 가장 앞서 있는 수가 더 앞에 배치가 된다는 것도 요번에 첨 알았습니다

이런걸 알고 있었더라면 문제를 더 쉽게 풀었을 텐대 아쉬웠고 자바 언어에서 제공하는 메소드와 인터페이스 등을 잘 알아야겠다라는 것을 깨달았던 문제였습니다... ㅠㅠ 

 

참고로

앞서 말한대로 MergeSort을 이용해서 푸신 분 은 댓글 과 가능하면 코드 부탁드립니다!! 

Sort로는 불가능 하다면 이유 역시 댓글로 적어주시면 너무 감사합니다

728x90
반응형