my study.

Coding Test/Programmers

[프로그래머스] 프로세스, java

fftl 2025. 1. 28. 01:37

- 문제

 

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

- 풀이

import java.util.*;

class Solution {

    //일일이 location 프로세스의 위치를 찾기 힘드므로
    //내가 찾아야 하는 프로세스에 표시를 해놓고 queue를 돌려
    //쉽게 확인하기 위한 Node 클래스
    static class Node{
        int num;
        boolean get;
        
        public Node(int num, boolean get){
            this.num = num;
            this.get = get;
        }
        
        public String toString(){
            return num+","+get;
        }
    }
    
    //현재 가장 우선순위가 높은 프로세스가 무엇인지 찾기 위한 
    //find() 함수
    static void find(){
        for(int i=max; i>=0; i--){
            if(arr[i]>0){
                max = i;
                return;
            }
        }
    }
    
    //전역적으로 사용할 법 하여 static으로 선언해 놓은 변수들
    static int max;
    static int[] arr;
    
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int len = priorities.length;
        
        //각 프로세스의 크기를 담아 놓을 arr 배열
        arr = new int[10];
        //max에 올 수 있는 가장 큰 수인 9를 넣어놓고 시작합니다.
        max = 9;
        
        //Node를 넣고 실제 큐를 돌리며 문제를 해결합니다.
        Queue<Node> q = new LinkedList<>();
        
        //arr에 우선순위별 프로세스의 수를 기록하고
        //q에 각 프로세스를 넣으며 내가 찾아야 하는 
        //location 프로세스도 get을 통해 표시합니다.
        for(int i=0; i<len; i++){
            arr[priorities[i]]++;
            if(i!=location) q.add(new Node(priorities[i], false));
            else q.add(new Node(priorities[i], true));
        }
        
        //현재의 최고 우선순위 프로세스의 값을 찾습니다.
        find();
        
        int num = 1; //앞으로 꺼내게 될 프로세스의 순서를 기록해줄 num
        
        //num이 len보다 커지면 모든 프로세스를 꺼냈음이므로
        //종료 조건을 설정해줍니다.
        while(num<=len){
            
            Node now = q.poll(); //가장 앞에 있는 Node를 꺼내줍니다.
            
            //만약 now의 우선순위가 max와 같다면(다시 넣지 않아야 함)
            if(now.num == max){
                
                //내가 찾아야 하는 프로세스라면
                if(now.get){
                    return num; //정답 제출
                
                //찾아야 하는 프로세스는 아니라면
                } else {
                    arr[max]--; //해당 우선순위의 프로세스 개수를 줄여줍니다.
                    find();     //우선순위가 가장 높은 프로세스가 바뀔 수 있기 때문에 find를 통해 update해줍니다.
                    num++; //이번 프로세스 또한 꺼냈기 때문에 꺼낸 프로세스 수를 증가시켜줍니다.
                }
                
            //최대 우선순위 프로세스가 아닐 경우 그대로 다시 q에 넣어줍니다.
            } else {
                q.add(now);
            }
        }
        
        //이곳이 실행될 일이 없지만, 코드상 필요하므로 둡니다.
        return answer;
    }
}