[java] 프로그래머스 - 프린터

1 분 소요

업데이트:

문제

프로그래머스-프린터
인쇄 대기목록에 있는 문서들 중 주어진 location번째 문서의 인쇄 순서를 구하는 문제.

  • 조건
    가장 앞에있는 문서를 꺼낸 후 인쇄 대기목록에서 우선순위가 높은 문서가 대기중이라면 대기열 마지막으로 보낸다.
    우선순위가 높은 문서가 없다면 인쇄한다.

풀이

인쇄작업의 중요도는 1~9로 표현되어있으므로 처음 대기목록에 넣을 때 갯수를 넣어줬다.
중요도 1인 문서 2개, 3인 문서 1개 .. 대기열에서 우선순위 높은 문서를 검색할 때
현재뽑은 문서의 중요도보다 큰 문서들의 개수만 보면 되니까!

소스코드

import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int solution(int[] priorities, int location) {
		Queue<Integer> idx = new LinkedList<>();
		Queue<Integer> pr = new LinkedList<>();
		int chk[] = new int[10];
		for (int i = 0; i < priorities.length; i++) {
			idx.add(i);
			pr.add(priorities[i]);
			chk[priorities[i]]++;
		}
		int cnt = 0;
		while (!idx.isEmpty()) {
			int curr = pr.poll(); // 현재 뽑은 문서의 우선순위
			int index = idx.poll(); // 현재 뽑은 문서의 인덱스
			boolean highPR = false;
			for (int i = curr+1; i < 10; i++) {
				if (chk[i]>0) {
					highPR = true;
					break;
				}
			}
			if (highPR) { // 높은 문서가 존재해? 다시넣어
				pr.add(curr);
				idx.add(index);
				continue;
			}
			cnt++; // 프린트하는 경우 인쇄횟수 추가하고 우선순위 개수차감
			chk[curr]--;
			if (index == location) {
				return cnt;
			}
		}
		return cnt;
	}
}

다른사람의 코드

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int l = location;

        Queue<Integer> que = new LinkedList<Integer>();
        for(int i : priorities){
            que.add(i);
        }

        Arrays.sort(priorities);
        int size = priorities.length-1;

        while(!que.isEmpty()){
            Integer i = que.poll();
            if(i == priorities[size - answer]){
                answer++;
                l--;
                if(l <0)
                    break;
            }else{
                que.add(i);
                l--;
                if(l<0)
                    l=que.size()-1;
            }
        }

        return answer;
    }
}

댓글남기기