[프로그래머스 - 자바(JAVA)] 31 : 프로세스

서예진·2024년 2월 28일
0

목차

▸ 프로세스


✅ 프로세스 : Lv.2

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 스택/큐 > 프로세스

▼ 내 풀이

  • 꺼낸 요소의 우선순위보다 대기중에 있는 요소의 우선순위가 더 크면 그 요소가 나갈때까지 요소들은 나가고 다시 큐에 들어간다.
  • 우선 while문을 통해서 문제에 접근하고자 했다.
  • 또한, location을 어떻게 처리할지 고민하는데 많은 시간을 보냈다. 그래서 새로운 큐를 2개 만들었다.
  • 즉, 기본 큐, 기본 큐와 같이 관리하는 index가 담긴 큐, 큐에서 나온 요소의 index를 담는 큐 이렇게 3개 만들었다.
  • 예를들어 priorities 배열이 [2, 1, 3, 2] 일 때, 기본 큐(q)에는 priorities 배열대로 저장하고 index 큐(q_num)에는 [0, 1, 2, 3]으로 저장된다.
  • 이 때, while문을 돌면서 기본 큐에서 나온 숫자보다 큰 값이 있을 경우 이 숫자는 다시 기본 큐에 저장되며 이 로직은 index가 담긴 큐에도 적용된다.
  • 큰 값이 없을 경우 finish 큐에 q_num에서 나온 요소를 집어 넣는다.
  • 이렇게 되면 기본 큐에서 나온 요소의 index가 finish에 담기게 된다.
  • 마지막으로 indexOf()를 활용하여 문제의 정답을 반환했다.
import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        Queue<Integer> q = new LinkedList<>();
        Queue<Integer> q_num = new LinkedList<>();
        List<Integer> finish = new ArrayList<>();
        
        // 큐 세팅
        for(int i = 0; i < priorities.length; i++) {
            q.offer(priorities[i]);
            q_num.offer(i);
        }
        
        // 우선순위에 따라 재배열
        while(!q.isEmpty()) {
            int num1 = q.poll();
            int num2 = q_num.poll();
            
            // q에 있는 요소들 중에서 현재 값(num1)보다 큰 값을 찾는 반복문
            boolean foundLarger = false;
            for (Integer number : q) {
                if (number > num1) {
                    foundLarger = true;
                    break;
                }
            }

            // 현재 값(num1)보다 큰 값이 없으면 finish에 추가
            if (!foundLarger) {
                finish.add(num2);
            } else {
                // 현재 값(num1)보다 큰 값이 있으면 q와 q_num에 각각 추가
                q.add(num1);
                q_num.add(num2);
            }
        }
        
        return finish.indexOf(location) + 1;
    }
}

profile
안녕하세요

0개의 댓글