본문 바로가기
알고리즘/프로그래머스 LV.2

프로그래머스 LV.2 프린터

by 호롤롤로루야 2021. 9. 23.

프로그래머스 LV.2 프린터

1. 문제 링크

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

 

2. 문제 해결에 대한 아이디어

1. 인쇄 대기목록의 앞 뒤에서 작업이 일어나므로 Deque를 사용했다. Deque<Work> q = new ArrayDeque<>();

2. Work 클래스를 사용했으며, 요청 순서와 우선 순위로 구성하였다.

3. 먼저 int[] priorities에 있는 값들을 꺼내와 q에 넣었다.

4. q가 빌 떄까지 아래의 로직을 수행한다.

   . q의 맨 앞에 있는 work를 꺼낸다

   . Iterator<Work> iter 를 사용하여 q에 있는 값들 중 꺼낸 work보다 우선 순위가 높은 work가 있는지 확인한다.

      . 우선 순위가 높은 work가 있다면, 꺼낸 work를 맨 뒤에 넣는다.

   . 끝까지 돌았는데 if(!iter.hasNext()) 우선 순위가 높은 work 가 없으면 현재 꺼낸 work를 출력한다.

      . 꺼낸 worklocation을 비교하여 동일하면 반복을 멈춘다.

      . 다르면 ++answer를 한다.

 

3. 코드

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Iterator;

public class Solution {
	
	static class Work{
		int no;
		int priority;
		public Work(int no, int priority) {
			super();
			this.no = no;
			this.priority = priority;
		}
		
	}
	
	static Deque<Work> q = new ArrayDeque<>();
    public int solution(int[] priorities, int location) {
        int answer = 1;
        for(int i = 0 ; i < priorities.length ; i++) {
        	q.add(new Work(i, priorities[i]));
        }
        
        while(!q.isEmpty()) {
        	Work now = q.poll();
        	Iterator<Work> iter = q.iterator();
        	while(iter.hasNext()) {
        		if(iter.next().priority > now.priority) {
        			q.addLast(now);
        			break;
        		}
        	}
        	if(!iter.hasNext()) {
        		if(now.no == location)
        			break;
        		else
        			++answer;
        	}
        }
        
        return answer;
    }
}
 

4. 채점 결과

 

5. 느낀 점

1. 평소에 Iterator를 잘 안 쓰는데, 이 기회에 쓰게 되었다.

2. Iterator<콜렉션에 담긴 형태> iter = 콜렉션.iterator();

3. Iterator를 통해 객체에 접근하고 싶다면, Iterator.hasNext().XXX

 

댓글