본문 바로가기
Algorithm/Programmers

[프로그래머스(programmers)] (Lv2) 프린터

by 광진구뚝배기 2021. 5. 17.

알고리즘 문제 풀이 / 프로그래머스 (programmers)  -  프린터

 

문제 링크

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

 

이번 문제를 풀고나서 다른 사람들의 풀이를 살펴보는데 내가 짠 코드보다 한 단계 더 간편하게 풀 수 있어 그 풀이를 조금 응용해보았다.

 

 

문제 풀이

 

처음 시도

동일한 중요도 일 때, location의 위치를 구별해야하므로 check 이라는 변수를 두고 갱신되는 location의 위치를 찾아냈다.

public static int solution(int[] priorities, int location) {
	int answer = 1;
	int check = 0;
	Queue<Integer> q = new LinkedList<>();
	PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
	for(int i = 0; i < priorities.length; i++) {			
		q.add(priorities[i]);
		pq.add(priorities[i]);
	}

	while(q.size() > 0) {
		if(q.peek() != pq.peek()) {
			q.add(q.poll());
			if(check == location)
				location += q.size();
			check++;
		}else {
			if(location == check) break;
			q.remove();
			pq.remove();
			check++;
			answer++;
		}
	}
    return answer;
}

 

 

 

 

두번째 시도

location변수를 감소하는 방법

peek()으로 가져온 값이 location의 위치가 아닐 땐 location--하는 방법으로 풀었는데

이렇게 하면 따로 변수를 만들지 않아도 풀 수 있었다.

public static int solution(int[] priorities, int location) {
	int answer = 1;

	Queue<Integer> q = new LinkedList<>();
	PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
	for(int i = 0; i < priorities.length; i++) {			
		q.add(priorities[i]);
		pq.add(priorities[i]);
	}

	while(q.size() > 0) {
		if(q.peek() != pq.peek()) {
			q.add(q.poll());
			location = location > 0 ? location-1 : q.size()-1;
				
		}else {
			if(location == 0) break;
			q.remove();
			pq.remove();
			location--;
			answer++;
		}
	}

	return answer;
}
반응형

댓글