devFancy BE Developer

[Programmers] 42587. 프린터

2023-03-29
devFancy

문제 링크

성능 요약

  • 메모리: 78.4 MB, 시간: 0.68 ms

구분

  • 코딩테스트 연습 > 스택/큐

Answer Code1(23.03.29)

import java.util.*;
class Solution {
    public int solution(int[] priorities, int location) {
        Queue<Pair> queue = new LinkedList<>();
        int answer = 0;

        for(int i = 0; i < priorities.length; i++) {
            queue.add(new Pair(i, priorities[i]));
        }

        while(!queue.isEmpty()) {
            int current = queue.peek().value;

            boolean flag = false;

            for(Pair pair : queue) {
                if(pair.value > current) {
                    flag = true;
                    break;
                }
            }

            if (flag) { //우선순위가 높은게 있으면 뒤로 보낸다.
                Pair temp = queue.poll();
                queue.add(temp);
            } else {
                answer++;
                Pair pair = queue.poll();

                if(pair.index == location) {
                    return answer;
                }
            }
        }

        return answer;
    }
    class Pair {
        int index;
        int value;

        public Pair(int index, int value) {
            this.index = index;
            this.value = value;
        }
    }
}

Answer Code2(23.03.29)

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        // 1. 큰 수가 우선순위를 갖는 우선순위 큐
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        int answer = 0;
        
        //2. 우선순위 큐에 배열값 넣어주기
        for (int i = 0; i < priorities.length; i++) {
            pq.add(priorities[i]);
        }
        // 3. 큐의 값이 없어지기 전까지 반복
        while (!pq.isEmpty()) {
            for (int i = 0; i < priorities.length; i++) {
                // 4.만약 큐의 가장 높은 숫자가 배열의 i번째 index값과 같다면
                if (priorities[i] == pq.peek()) {
                    // 5.값과 위치가 모두 같다면 answer 리턴
                    if (i == location) {
                        answer++;
                        return answer;
                    }
                    // 6.값만 일치하는 경우 해당 문서 출력
                    pq.poll();
                    answer++;
                }
            }
        }
        return -1;
    }
}

Answer Code3(23.12.17)

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        Queue<Pair> queue = new LinkedList<>();
    

        for(int i = 0; i < priorities.length; i++) {
            queue.add(new Pair(i, priorities[i]));
        }

        while(!queue.isEmpty()) {
            int currnet = queue.peek().value;

            boolean flag = false;

            for(Pair pair : queue) {
                if(pair.value > currnet) { // 현재 값보다 나머지 값이 우선순위가 더 높다면
                    flag = true;
                    break;
                }
            }
            if(flag) {
                Pair temp = queue.poll();
                queue.add(temp);
            } else {
                // 현재 값이 나머지 값보다 우선순위가 더 높다면 answer++
                answer++;
                Pair pair = queue.poll();

                if(pair.index == location) { // 현재 찾고자 하는 위치이면 출력
                    return answer;
                }
            }
        }

        return answer;
    }
    class Pair {
        int index;
        int value;

        public Pair(int index, int value) {
            this.index = index;
            this.value = value;
        }
    }
}

Review

  • 1번은 그냥 큐로 구현한 것이고, 2번은 우선순위 큐로 구현한 것이다.

  • 문제에 대한 설명을 읽고 직관적으로 큐를 사용해서 구현해야 했다.

  • 큐에 남아있는 값들 중 방금 뽑은 값보다 더 높은 우선순위가 있으면 다시 큐에 넣는 식으로 했다.

Reference


Comments

Index