본문 바로가기
문제풀이/Programmers 문제풀이

[ 알고리즘 ] 코딩 - Programmers - 프린터.java

by 마늘아빠 2020. 12. 26.
728x90
반응형

문제 링크

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr


* 프로그래머스 - Level 2 - (자바)프린터 - Queue를 이용한 우선순위 결정

제한 사항
입출력예시


< 로직 >

* 배열로 들어오는 모든 우선순위를 priQueue에 옮겨 담음

* 가장 앞의 숫자를 기준으로 더 큰 숫자가 있을 때 까지 임시 Queue에 저장하며 priQueue 순회하며

tmpQueue에 넣음

* 더 큰 숫자를 만나게 되면 priQueue의 뒤에 tmpQueue의 숫자를 연달아 붙임

일반 로직
순번이 가장 큰 경우


import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public int solution(int[] priorities, int location) {
            Queue<Integer> priQueue = new LinkedList<Integer>(); // 우선순위 저장
	    	Queue<Integer> orderQueue = new LinkedList<Integer>(); // 우선순위 위치 인덱스 저장
	    	
	    	for(int i = 0 ; i < priorities.length; i++) {
	    		priQueue.offer(priorities[i]); // 현재 숫자 넣기
	    		orderQueue.offer(i); // 인덱스 저장
	    	}

	    	int answer = 0; // 정답
	    	
	    	while(!priQueue.isEmpty()) { // 원하는 위치까지 도달할 때까지 반복
	    		Queue<Integer> tmpQueue = new LinkedList<Integer>(); // 임시 우선순위
	    		Queue<Integer> tmpOrderQueue = new LinkedList<Integer>(); // 임시 위치인덱스
	    		
	    		int cur_pri = priQueue.poll(); // 현재 우선순위
	    		
	    		tmpQueue.offer(cur_pri); // 일단 임시에 담자
	    		tmpOrderQueue.offer(orderQueue.poll()); // 순번 기억
	    		
	    		boolean flag = false; // 자신보다 큰 값이 있는지 파악
	    		
	    		while(!priQueue.isEmpty()) { // 현재 자신을 뺀 나머지와 비교
	    			int next_pri = priQueue.peek(); // 다음 값 슬쩍 보기
	    			
	    			if(cur_pri >= next_pri) { // 자기보다 작거나 같은 수라면 임시 Queue에 저장
	    				tmpQueue.offer(priQueue.poll());
	    				tmpOrderQueue.offer(orderQueue.poll());
	    			} else { // 자기보다 큰 수가 나타났다면?!
	    				flag = true;
	    				while(!tmpQueue.isEmpty()) { // 임시 큐에 담은 숫자들을 옮겨담자
	    					priQueue.offer(tmpQueue.poll());
	    					orderQueue.offer(tmpOrderQueue.poll());
	    				}
	    				break; // 큰 값이 나타났으면 멈춤
	    			}
	    		}
	    		
	    		if(!flag) { // 자기보다 큰 수 없었음
    				answer++; // 현재 자신이 출력되므로 카운트+1
    				tmpQueue.poll(); // 자기 자신은 출력
    				int cur_order = tmpOrderQueue.poll(); // 현재 인덱스가
    				
    				if(cur_order == location) break; // 원하는 위치라면 전체 멈춤
    				
    				while(!tmpQueue.isEmpty()) { // 임시 큐에 담은 숫자들을 옮겨담자
    					priQueue.offer(tmpQueue.poll());
    					orderQueue.offer(tmpOrderQueue.poll());
    				}
    			}
	    	}
	    	
	        return answer;
    }
}
반응형