프로그래머스 - 프로세스
카테고리: 스택/큐
레벨: 2
언어: Java
문제
입출력 예시
풀이
프로세스 문제를 이해하는 데는 오래 걸리지 않았다. 하지만 어떻게 풀어야 되는지 잘 모르는 문제였다.
우선순위에 따라서 주어진 프로세스의 위치를 알려줄 때 몇 번째로 실행되는지 구하는 문제여서 Queue 자료구조를 통해서 풀어야 한다는 것은 알았지만, 우선순위 큐가 있다는 것은 모르고 있었다.
먼저 우선순위 큐를 활용하여 푼 코드를 살펴보면
public int solution(int[] priorities, int location) {
int answer = 0;
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
for (int num : priorities) {
priorityQueue.add(num);
}
while (!priorityQueue.isEmpty()) {
for (int i = 0; i < priorities.length; i++) {
if (priorities[i] == priorityQueue.peek()) {
priorityQueue.poll();
answer++;
if (i == location) {
return answer;
}
}
}
}
return answer;
}
먼저 PriorityQueue를 만들어주는데 여기서 Collections 클래스의 reverseOrder() 메서드를 사용하여 내림차순 정렬을 하게 된다.
그 후 forEach문을 통해서 priorities에 들어있는 값들을 Queue에 넣어준다. (내림 차순으로 정렬됨)
마지막으로 while문을 통해서 priorities[i]의 값과 Queue의 peek 값을 비교하여 같다면 우선순위가 높은 것이기 때문에 해당 데이터를 poll() 해주고 answer를 1 증가해 준다.
i와 받아오는 location값이 같다면 answer 값을 반환해 주며 종료된다.
내가 작성한 코드를 살펴보면서 부족한 점을 체크해 봤다.
Queue<Integer> queue = new LinkedList<>();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < priorities.length; i++) {
queue.add(priorities[i]);
}
for (int i = 0; i < priorities.length; i++) {
int max = queue.poll();
if (max < queue.peek()) {
queue.add(max);
max = queue.poll();
} else {
queue.add(max);
list.add(i);
}
}
먼저 Queue에 받아온 priorities 값들을 넣어주고 반복문을 실행하였다.
max 값을 poll()로 받아와 max값과 peek() 값을 비교하며 코드를 작성했는데 여기서 location 값을 어떻게 활용해야 될지 감이 안 왔다.
여기서 한 가지 더 문제가 있던 것은 max에 내가 생각했던 값이 제대로 들어가지 않는 문제가 있었다.
for문이 시작하면 max에 poll()로 뽑아온 값을 저장하게 되는데 이렇게 작성하니 내가 생각했던 값으로 갱신되지 않고 전혀 다른 값들이 저장되게 되었다.
어찌 보면 당연한 기초지만 그것까지 고려하지 않았던 내 자신을 반성하게 되었다.
우선순위 큐를 한 번 공부해서 정리하여 자료 구조 지식을 더 키워야겠다.
'알고리즘 공부' 카테고리의 다른 글
프로그래머스 - 다리를 지나는 트럭 (0) | 2023.12.05 |
---|---|
알고리즘 - 하노이 탑 (0) | 2023.12.05 |
프로그래머스 - 올바른 괄호 (0) | 2023.12.04 |
프로그래머스 - 기능개발(Java) (1) | 2023.11.29 |
프로그래머스 - 같은 숫자는 싫어(Java) (0) | 2023.11.29 |