본문 바로가기

개발지/코테

[프로그래머스] 코테연습 - 프로세스(lv.2)

- 내 방법 풀이

  • 문제 유형을 보고 Queue를 활용하여 풀 생각을 했다. 또한 Queue의 대표적 활용 예시이기 때문에 Queue를 선언했고, 중요도와 제한조건을 생각해서 max를 구할 생각을 했다.
  • 처음에 예시를 보고 priorities에 작업마다 우선순위(숫자 1~9)와 이름(A~Z)가 배열로 제공된 줄 알고 HashMap<String, Integer>로 풀어야 하나 생각했는데 우선순위 배열만 주어져서 실행된 작업이 location에 있던 작업인지 어떻게 확인할 지 고민되었다.
  • location의 값을 조정하며, 큐에서 poll할 때 location이 0이었다면 구하고자 하는 값을 구할 수 있을거라고 생각했다.
import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 1;
        // 차례대로 꺼냄. 프로세스 중요도가 더 높은 것이 큐 안에 있으면 다시 넣기
        // location번째 작업이 실제로 몇 번째로 실행됬는지를 리턴
        Queue<Integer> queue = new LinkedList<>();
        
        for (int i : priorities) {
            queue.add(i);
        }
        
        while (true) {
            int max = 0; 
            
            for (int i : queue) { // 최우선작업 중요도
                if (i > max) max = i;
            }
            
            int nowProcess = queue.poll();
            
            if (nowProcess == max) { // 꺼낸 작업이 최우선작업인 경우
                if (location == 0) {
                    break;
                } else {
                    location--;
                    answer++;
                }
            } else { // 꺼낸 작업의 중요도가 max보다 작은 중요도일 경우
                queue.add(nowProcess); // 다시 큐에 넣기
                if (location == 0) {
                    location = queue.size() - 1;
                } else {
                    location--;
                }
            }
        }
        return answer;
    }
}

- 다른 사람 방법 풀이

  • 다른 사람 풀이를 찾아보니 우선순위 큐를 활용한 풀이들이 많이 나왔다. 익숙치 않았기 때문에 Queue로만 푼 풀이를 가져왔다.
  • priorities를 정렬하여 가장 높은 중요도를 찾고 큐에서 poll한 작업의 중요도가 가장 높다면 작업을 실행시킨 것으로 만들고 answer와 location을 조정한다. 그리고 location이 -1이 됬다면 작업이 실행된 것이므로 반복문을 중단한다.
  • priorities에서 가장 높은 중요도를 찾는 것이 특이했는데, 원래 사이즈에서 이미 실행된 작업의 수를 빼는 방식으로 구했다. 내 정답 코드에서 매번 반복문을 실행하는 것보다 더 효율적인 부분이다.
import java.util.*;

class Solution { 
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int l = location;

        Queue<Integer> que = new LinkedList<Integer>();
        for(int i : priorities){
            que.add(i);
        }

        Arrays.sort(priorities);
        int size = priorities.length-1;



        while(!que.isEmpty()){
            Integer i = que.poll();
            if(i == priorities[size - answer]){
                answer++;
                l--;
                if(l <0)
                    break;
            }else{
                que.add(i);
                l--;
                if(l<0)
                    l=que.size()-1;
            }
        }

        return answer;
    }
}