본문 바로가기
Algorithm

[프로그래머스] 프린터

by seungh2 2022. 12. 16.

프로그래머스 <프린터>

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

 

프로그래머스

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

programmers.co.kr


프린터

아래와 같은 방식으로 인쇄 작업을 수행하는 프린터에서 내가 요청한 문서가 몇 번째로 인쇄되는지 구하여라.

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

현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서의 위치 location이 들어온다.

 

내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 반환한다.


문제해결

주어진 수행 방식을 그대로 구현하면 된다.

 

먼저 큐에 인쇄 대기목록을 모두 넣었다. 원래 몇 번째 문서였는지 기억하기 위해 Tuple이라는 클래스를 따로 만들어서 사용하였다. 큐에 넣는 과정에서 가장 높은 우선순위가 무엇인지 구해 max에 저장하였고 각 우선순위에 맞는 문서가 몇 개인지 count 배열에 저장하였다.

 

  • 큐에서 값을 하나씩 꺼내면서 max값과 같다면 문서를 인쇄한다.
    • 인쇄한 문서가 내가 요청한 문서라면 몇 번째 인쇄되었는지를 의미하는 order 값을 반환하면 된다.
    • 그렇지 않은 경우에는 count 배열의 값을 update 하고, 필요하다면 max 값도 update 한다.
  • 그렇지 않은 경우에는 꺼낸 값을 다시 큐에 넣는다.

코드

import java.util.*;
class Solution {
    static class Tuple{
        int idx, priority;
        public Tuple(int idx, int priority){
            this.idx = idx;
            this.priority = priority;
        }
    }
    public int solution(int[] priorities, int location) {

        Queue<Tuple> Q = new ArrayDeque<>();
        int[] count = new int[10];  // count[i] : 우선순위가 i인 작업의 개수
        int max = Integer.MIN_VALUE;    // max : 현재 가장 높은 우선순위
        for(int i = 0; i < priorities.length; i++){
            count[priorities[i]]++;
            Q.add(new Tuple(i, priorities[i]));
            max = Math.max(max, priorities[i]);
        }
        int order = 0;  // order : 몇 번째로 인쇄된 문서인지
        while(!Q.isEmpty()){
            Tuple tp = Q.poll();
            if(tp.priority == max){ // 현재 문서가 가장 우선순위가 높은 문서라면
                order++;
                if(tp.idx == location){ // 현재 문서가 내가 인쇄를 요청한 문서라면
                    break;
                }
                count[max]--;
                if(count[max] == 0){
                    while(true){
                        max--;
                        if(count[max] != 0){
                            break;
                        }
                    }
                }
            }else{
                Q.add(tp);
            }
        }
        return order;
    }
}

시도해본 테스트케이스

/*
[4, 3, 2, 1]
2

3
---------------
[1, 2, 3, 4]
2

2
---------------
[2, 2, 2, 2, 2, 2]
3

4
---------------
*/

결과


 

728x90

'Algorithm' 카테고리의 다른 글

프로그래머스 <게임 맵 최단거리>  (0) 2023.01.01
백준 1303번 <전쟁-전투>  (0) 2022.12.27
백준 5567번 <결혼식>  (0) 2022.12.15
비슷한 단어  (0) 2022.10.23
백준 1600번 <말이 되고픈 원숭이>  (0) 2022.10.03

댓글