프로그래머스 - 프로세스 - Queue - Java

chaemin·2024년 7월 30일
0

프로그래머스

목록 보기
62/64

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42587

2. 풀이

priorities[] = {1, 1, 9, 1, 1, 1}
이라면 이걸 list에 담아서 내림차순 정렬을 진행하였다.
(생각해보니 그냥 배열을 내림차순으로 정렬하는 것도 나쁘지 않을 듯)

그럼 list = {9, 1, 1, 1, 1, 1}이 될 것이고, Queue에 넣으면서 list의 index가 가리키는 값과 같은지 확인하고, 같으면 location을 확인해서 location위치면 바로 break, 아니면 그냥 index++와 answer++(몇번째 출력인지 알아야 하니까) 해주었다.

만일 index가 가리키는 값과 같지 않다면 다시 Queue에 넣어줌으로써 맨 뒤로 보내는 것이 핵심이다.

✨핵심 Point

Set을 쓰지 않은 이유는 중복을 하게 된다면 ArrayList로 변환했을때 max값의 index를 처리하기가 어려웠다. 따라서 그냥 계속해서 index를 늘려가면서 찾아주는 방식으로 처리하였다.

3. 전체 코드

import java.util.*;
class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        
        Set<Integer> set = new HashSet<>();
        Queue<Process> q = new LinkedList<>();
        ArrayList<Integer> list = new ArrayList<>();
        
        int max = 0;
        for(int i = 0; i < priorities.length; i++){
            //set.add(priorities[i]);
            list.add(priorities[i]);
            q.add(new Process(i, priorities[i]));
            //max = Math.max(max, priorities[i]);
        }
        //set.stream().sorted();
        //ArrayList<Integer> list = new ArrayList<>(set);
        Collections.sort(list, Collections.reverseOrder());
        
        int maxIndex = 0;
        max = list.get(maxIndex);
        
        while(!q.isEmpty()){
            Process pc = q.poll();
            
            if(pc.priority == max){
                if(pc.num == location){
                    break;
                }
                max = list.get(++maxIndex);
                answer++;
            } else{
                q.add(pc);
            }
        }
        
        return ++answer;
    }
    
    public class Process{
        int num;
        int priority;
        
        public Process(int num, int priority){
            this.num = num;
            this.priority = priority;
        }
    }
}

0개의 댓글