[프로그래머스 / Java] 프린터 #42587

dOcOb·2023년 2월 20일
0

프로그래머스

목록 보기
3/4

0. 문제


1개 이상 100개 이하의 문서는 각각 1부터 9까지의 중요도를 가진다.
위 문서들을 다음 조건으로 프린트를 하는 프린터가 있다.

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

이때, 입력하는 문서의 배열 priorities 에서
index가 location 인 요소는 몇 번째로 출력되는지
반환하는 Solution을 작성하시오.

Test Case

prioritieslocationreturn
[2, 1, 3, 2]21
[1, 1, 9, 1, 1, 1]05
[2, 5, 7, 3, 5, 7, 8, 4, 1]53




1. Solution1


1.1 이론

입력되는 배열을 index 순으로 queue에 담고,
프린트가 진행되는 과정을 코드로 변경해보았다.

  1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
    -> 저장한 queue를 하나씩 꺼낸다.

  2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.

  3. 그렇지 않으면 J를 인쇄합니다.
    -> queue안에서 꺼낸 문서(Doc)가 현재 가장 높은 우선 순위인지 체크 후,
    출력 또는 뒤로 배치하며 cnt++.



1.2 코드

import java.util.*;

public class Num42587 {
    public int solution(int[] priorities, int location) {
        int cnt = 0;
        int prLen = priorities.length;

        Queue<Doc> que = new LinkedList<>();

        for (int i = 0; i < prLen; i++) {
            if (i == location) {
                que.add(new Doc(priorities[i], true));
            }else {
                que.add(new Doc(priorities[i], false));
            }
        }

        Comparator<Doc> comparator = Comparator.comparingInt(Doc::getPriority);

        while (true) {
            Doc max = que.stream().max(comparator).get();

            Doc doc = que.poll();

            if(doc.priority == max.priority){
                cnt++;
                if(doc.pick) break;
            }
            else que.add(doc);
        }

        return cnt;
    }

    private class Doc {
        int priority;
        boolean pick;

        public Doc(int priority, boolean pick) {
            this.priority = priority;
            this.pick = pick;
        }

        public int getPriority() {
            return priority;
        }
    }
}
profile
반은 해야 시작이다.

0개의 댓글