- 문제
프로그래머스
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;
}
}
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 롤케이크 자르기, java (0) | 2025.01.31 |
---|---|
[프로그래머스] 타겟 넘버, java (0) | 2025.01.28 |
[프로그래머스] 전화번호 목록, java (0) | 2025.01.27 |
[프로그래머스] 피로도, java (0) | 2025.01.27 |
[프로그래머스] 기능개발, java (0) | 2025.01.21 |