알고리즘/백준 알고리즘

[java] 백준 알고리즘 1966번 프린터 큐 풀이

희랍인 조르바 2018. 6. 25. 13:32



단순히 큐를 이용하는 것에서 부가적으로 중요한 것부터 출력해내야 하는 것이 문제의 핵심이다.



* 풀이 소스


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class Baekjoon1966 {
 
    static StringTokenizer st;
    static Queue<Integer> importance;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        st = new StringTokenizer(br.readLine());
    
        int testCase = Integer.parseInt(st.nextToken());
        
        for(int t=0; t<testCase; t++) {
            st = new StringTokenizer(br.readLine());
            int docCount = Integer.parseInt(st.nextToken());
            int wantToKnowNumOrder = Integer.parseInt(st.nextToken());
            importance = new LinkedList<Integer>(); // 중요도가 들어간 배열
            int[] sortedArray = new int[docCount]; // 중요도를 오름차순으로 정렬하기 위한 배열
            
            st = new StringTokenizer(br.readLine());
            for(int i=0; i< docCount; i++) {
                int importanceNum = Integer.parseInt(st.nextToken());
                importance.add(importanceNum);
                sortedArray[i] = importanceNum;
            }
            Arrays.sort(sortedArray); // 중요한 것부터 출력하기 위해 따로 배열을 만들어 오름차순 정렬
            
            int importanceOrder = sortedArray.length-1// 중요도가 가장 큰 것부터 출력하기 위한 순서
            int order = 0// 출력 횟수
            int calCount = 0// 입력 순서에 맞춰서 순서를 기억하기 위한 변수
            
            while(true) {
                int pollNum = importance.poll();
                
                if(calCount == wantToKnowNumOrder) { // 큐에서 out 될 때 알고싶은 00번째 수를 알 수 있다. 
                    pollNum += 101// 주어지는 수가 100이하이므로 다른 위치에 똑같은 중요도가 나오더라도 다른 점수로 만들어줌
                }
                calCount++;
                
                if(sortedArray[importanceOrder] == pollNum-101) { // 알고 싶은 수의 중요도만 101을 넘어가기 때문에 해당 숫자가 나오면 끝.
                    order++;
                    bw.write(String.valueOf(order));
                    bw.newLine();
                    break;
                    
                }else if(sortedArray[importanceOrder] == pollNum){ // 중요도가 높은 것이 출력되면 다음 중요도가 높은 것으로 이동
                    order++;
                    importanceOrder--;
                }else {
                    importance.add(pollNum); // 어느 해당 사항도 없으면 다시 큐 맨 뒤로 추가해준다
                }
            }
        }
        bw.flush();
    }    
}
 
cs