문제
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
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 함수를 작성해주세요.
제한사항
- 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
- 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
- location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.
나의 코드
import java.util.*;
public class Printer {
public static int solution(int[] priorities, int location) {
int answer = 0;
int comp = 0;
Queue<Print> q = new LinkedList<>();
Queue<Print> succ = new LinkedList<>();
for(int i=0; i<priorities.length; i++) {
q.offer(new Print(priorities[i], i));
}
while(!q.isEmpty()) {
comp=0;
if(q.size() == 1) {
succ.offer(q.poll());
}else {
Print p = q.poll();
for(Print comP : q) {
if(p.priority < comP.priority) {
q.offer(p);
comp++;
break;
}
}
if(comp==0) {
succ.offer(p);
comp=0;
}
}
}
for(Print s : succ) {
if(location == s.mine) { break; }
else { answer++; }
}
return answer+1;
}
}
class Print{
int priority;
int mine;
public Print(int priority, int mine) {
this.priority = priority;
this.mine = mine;
}
}
나의 풀이
location이라는 인자 값은 자신이 뽑을 프린터의 위치를 갖고 있다.
하지만 중요도의 중복이 생길 수 있기 때문에 위치를 Print클래스의 mine 을 통해 식별자를 만들어줬다.
1. int comp - 출력 되기 전 뒤에 우선순위가 더 높은 프린트물이 있는지 확인하는 변수
2. 출력하기 전 대기하고 있는 프린트 물 Queue<Printer> q
3. 프린팅이 완료된 값을 저장할 Queue<Printer> succ
4. i를 증가시키는 for문을 통해 프린트의 우선순위가 식별 값 i를 넣는다. (Print Class)
5. 출력되기 전 대기하고 있는 큐 q 가 빈 값이 될때까지 while을 돌린다.
6. 체크변수 comp를 초기화시켜준다.
7. 만약 q의 size가 1이 되어서 for문이 제대로 안 돌아갈 경우를 방지 하나 남으면 succ에 그냥 넣어버린다.
8. else는 q의 size가 2 이상이어서 for문의 에러가 발생하지 않는다.
9. Print p 에 q의 가장 앞에 있는 값을 poll 시켜서 저장한다.
10. for문을 통해 뒤에 우선순위가 p보다 높은 값이 있는지 확인한다.
11. 있다면 다시 q에 빼놓은 p를 집어넣고 comp를 증가시켜주며 break;
12. for문을 다 돌았는데 comp가 0이라면 뽑아놓은 p가 가장 큰 값이라는 뜻이기 때문에 succ에 추가하며 comp초기화
13. 완료된 프린트 succ을 for문 돌려 내 프린트물 (location) 의 값과 같으면 break 시킨다.
14. 그렇지 않다면 몇 번째에 있는지 판단을 위해 answer++
15. 하지만 문제에서 요구하는 건 index 0 에있다면 첫 번째에 프린트이기 때문에 answer+1로 return 시킨다.
'코딩테스트 풀이 > 프로그래머스' 카테고리의 다른 글
스택/큐 - 주식가격 [JAVA] (0) | 2020.05.27 |
---|---|
스택/큐 - 쇠막대기 [JAVA] (0) | 2020.05.27 |
스택/큐 - 기능개발 [JAVA] (0) | 2020.05.25 |
스택/큐 - 다리를 지나는 트럭 [JAVA] (0) | 2020.05.24 |
스택/큐 - 탑 [JAVA] (0) | 2020.05.23 |