본문 바로가기
Algorithm/프로그래머스 고득점 Kit

[스택/큐] 프린터 - Java코드

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

 

문제

 

이해

문제를 보면, 해당 location에 있는 문서가 몇번째로 출력되는지를 구하는문제인데,

차례대로 우선순위를 확인하여 , 우선순위가 아니면, 작업을 맨뒤로 보내버린다.

즉. 선입 선출 구조의 큐를 이용해야 한다.

Peek 작업이 Queue가 가지는 max값(최고 우선순위값)이 아니라면 맨뒤에 넣어주는 작업을 하면서, 

해를 구하면 되겠다.

 

풀이

입력으로 들어오는 작업목록을 Queue 초기화해주고,

Collections.max 메소드를 이용해서, 최상위 우선순위인지 확인하며 작업한다.

최상위 우선순위가 아니라면, poll하여 뒤로 다시 offer해준다.

최상위 우선순위이면서, 내가 찾고자하는 작업이면, 결과값을 리턴해준다.  

import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
   public static int solution(int[] priorities, int location) {
        // 작업목록을 Queue에 초기화
        Queue<Integer> q = new LinkedList<>();
        for (int priority : priorities)
            q.offer(priority);
        int cnt=0;
        // location을 기록하면서 반환개수 count
        while(!q.isEmpty()){
            // poll과 count
            if(Collections.max(q) == q.peek()){// 최상위 우선순위면 빼주면서 count
                if(location==0) // 결과 반환
                    return cnt;
                else{
                    cnt++;
                    q.poll();
                }
            }else{ // 우선순위가 아니면 뒤로 넣기
                q.add(q.poll());
            }
            // 위치 기록
            if(location!=0)
                location--;
            else
                location = q.size()-1;
        }
        return 0;
    }
}

 

Collections.max 메소드가 많은 코드를 줄일 수 있는 방법이다.

Collections에 max, min 메소드는 list와 Set, Map 등에서도 사용할 수 있다.