Algorithm/Programmers

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

담크 2021. 6. 13. 22:56

이번에는 프로그래머스에서 스택/큐 카테고리에 있는 프린터 문제를 풀어봤는데요

아직 알고리즘도 그렇고 문법도 뭔가 어려움이 많아 고민도 많이하고 시간도 많이 걸린거 같아요

먼저 문제를 보면

잘 안보이시다면 

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

여기를 참고해주세요~

 

 


문제풀이

import java.util.*;

public class Solution {

	public int solution(int[] priorities, int location) {
    
		// PriorityQueue를 사용해서 숫자가 높을수록 우선순위를 가지게 저장
		PriorityQueue<Integer> pq = new PriorityQueue<Integer>(Collections.reverseOrder());
		int answer = 0;

		for (int pri : priorities) {
			pq.offer(pri);
		}

		// 내가 인쇄요청한 문서 찾을때까지 반복
		while (pq.size() != 0) {
			for (int i = 0; i < priorities.length; i++) {
				// 내가 요청한 문서와 해당 문서의 인덱스를 알기위해 비교
				if (pq.peek() == priorities[i]) {
					pq.poll();
					answer++;

					// 내가 요청한 문서일때
					if (location == i) {
						pq.clear();
						break;
					}
				}
			}
		}
		return answer;
	}
}

 

PriorityQueue

- 들어온 숫자의 순서와 상관없이 우선순위가 높은 데이터를 먼저 출력한다.

- 숫자가 낮을수록 우선순위를 높게 가져 낮은 숫자가 먼저 출력된다. (오름차순)

- 내부요소가 힙구조로 이루어져있어 이진트리 구조를 가진다.

 

그래서 이번 문제에서는 높은 숫자가 우선순위를 가지게 되므로

.reverseOrder( )를 사용해서 오름차순에서 내림차순으로 정렬을 바꿔주었다.

 

그 이외에 사용한 메소드

 

.offer( ) : PriorityQueue에 값을 추가해준다.

 

.peek( ) : PriorityQueue의 첫번째 값(가장 앞에있는 값)을 가져온다.

 

.poll( ) : PriorityQueue의 가장 앞에 값을 반환하고 제거한다. (이 때 비어있다면 null을 반환한다.)

 

.clear( ) : 큐 초기화