알고리즘/프로그래머스 Level2

[프로그래머스,Java] Level2: 프린터

류창 2021. 11. 10. 22:13
반응형

 

문제분석

우선순위를 담은 배열과, 요청한문서의 위치가 입력값으로 주워집니다.

 

목표: 규칙에따라 인쇄작업을합니다. 그후, 요청한 문서가 몇번째로 출력이되는지 구해주세요.

 

규칙: 1. 대기순서대로 인쇄를합니다.

       2.만약, 남은 대기열중에 우선순위가 더높은문서가 있으면, 맨뒤로 보냅니다.

 

 

꽤나, 로직은 간단합니다.

 

문제힌트가 스택/큐를 사용하라고하니, 사용해봅시다.

 

대기목록이 최대 100개가있으니, n^2으로 풀어도 괜찮을것같습니다.

 

 

대기순서대로 인쇄를해야하니, FIFO인  큐를 쓰고싶어집니다.

 

Queue <> = new LinkedList<>()

 

하지만, 저는 남은 대기열중에 우선순위가 더높은 문서를 찾기위해, get()메소드를 쓰고싶습니다.

 

그런데 LinkedList를 Queue 인터페이스로 업캐스팅을 해버려서 못씁니다.

 

이걸 해결해버리기위핸 간단하죠.

 

LinkedList<>= new LinkedList<>()로 선언해버리면 끝입니다.

 

LinkedList는 인터페이스 List, Queue,Deque를 참조하고있어서, 

 

list의 기능, 큐의기능 모두 쓸수있습니다.

 

 

풀이 전략:

1.모든 원소를 LinkedList에 넣습니다.

2.LinkedList가 텅 비어잇을때까지 무한루프를돌립니다.

3.LinkedList의 첫원소가 나머지 우선순위보다 크면, 출력하고, 적으면 맨뒤로 보냅니다.    

 

문제풀이

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.*;
class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        LinkedList<int[]> print = new LinkedList<>();
        for(int i=0;i<priorities.length;i++){
            // 배열{프린트위치,우선순위} 저장
            print.add(new int[]{i,priorities[i]});
        }
        
        int prt_cnt=0//프린트순서
        
     Loop: while(!print.isEmpty()){
            for(int i=1;i<print.size();i++){
                //우선도가 떨어지면 맨뒤로 빼기
                if(print.peek()[1]<print.get(i)[1]){
                    print.add(print.poll());
                    continue Loop;
                }
            }     
            //인쇄를하였으니, 프린트순서 1증가
            prt_cnt++;
            if(print.peek()[0]==location){
                answer=prt_cnt;
            }
            print.poll();
        }
        
        return answer;
    }
}
cs

 

반응형