ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 프린터 Java 풀이
    문제풀이/프로그래머스 2021. 10. 21. 03:15
    반응형

    이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

    틀리거나 잘못된 정보가 있을 수 있습니다.

    댓글로 알려주시면 수정하도록 하겠습니다.


    1. 문제

    일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

     

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

    예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.

    내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.

    현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

    2. 입력

    • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
    • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
    • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

    3. 예제

    priorities location return
    2, 1, 3, 2 2 1
    1, 1, 9, 1, 1, 1 0 5

    4. 풀이

    문제를 보면 대기목록의 가장 앞에 있는 문서를 꺼내서 나머지 문서와 비교하여 큰 중요도의 문서가 하나라도 있으면 가장 뒤로 보내는 작업을 수행 하여야 합니다.

     

    1. 대기목록의 가장 앞에 있는 문서를 꺼낸다 -> 이부분은 자료 구조 큐를 이용하면 가장 손쉽게 구현되는 부분 입니다.
    2. 나머지 문서와 비교하여 가장 뒤로 보내는 작업 -> 이부분은 큐를 List 컬렉션으로 생성하면 add시 가장 뒤로 추가가 되기 때문에 List를 사용하면 됩니다.

    그래서 대기목록은 Queue<Print> queue = new LinkedList<>(); 코드를 통해 구성을 했습니다.

     

    여기서 Queue의 Element를 Priority인 Integer로 생성하게 된다면 출력하고자 하는 location과 비교가 불가능 하게되어 Priority와 location 두 값을 가지는 Print라는 class를 생성하였습니다.

     

    1. 이제 입력으로 주어진 우선순위와 index를 Print객체로 만들고 Print 객체를 queue에 add하였습니다.
    2. queue가 빈 값이 될때까지 반복문을 수행하여 하나의 Print 객체를 poll합니다.
    3. queue에 남은 Print객체들과 2번에서 poll한 Print객체의 Priority값을 비교합니다.
    4. 만약 2번에서 poll한 Print객체의 Priority보다 큰 값이 있는 경우 2번에서 poll한 Print객체를 다시 queue에 add합니다.
    5. 4번의 반대로 2번에서 poll한 Print객체의 Priority보다 큰 값이 없는 경우는 answer(정답)을 1개 증가 시킵니다.
    6. 2번에서 poll한 Print객체의 Priority값이 가장 큰 경우 2번에서 poll한 Print객체의 location과 입력으로 주어진 location이 같은경우 queue의 반복문을 빠져나와 정답을 Return 합니다.

    이번 문제는 문제에서 주어진 루틴을 코드로 동일하게 구현하면 정답을 맞출 수 있는 문제였습니다.

    5. 코드

    전체 코드는 Git에 있습니다.

    public int solution(int[] priorities, int location) {
    	int answer = 0;
    	Queue<Print> queue = new LinkedList<>();
    
    	for(int i=0; i< priorities.length; i++)
    		queue.add(new Print(priorities[i], i));
    
    	while (!queue.isEmpty()){
    		Print print = queue.poll();
    
    		boolean isUpperPriority = false;
    		for(Print sub : queue){
    			if(print.priority < sub.priority) {
    				isUpperPriority = true;
    				break;
    			}
    		}
    
    		if(isUpperPriority)
    			queue.add(print);
    		else{
    			answer++;
    			if(print.location == location)
    				break;
    		}
    	}
    	return answer;
    }
    
    public class Print{
    	private int priority;
    	private int location;
    
    	public Print(int priority, int location){
    		this.priority = priority;
    		this.location = location;
    	}
    }
    반응형

    댓글

Designed by Tistory.