컴퓨터/프로그래머스

프로그래머스 - 42587번: 프로세스 [Java]

이상한 나그네 2023. 10. 13. 00:14

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int[] rank = priorities.clone();
        Arrays.sort(rank);
        Deque <Deque<Integer>> d = new ArrayDeque<>();
        for(int i = 0; i < priorities.length; i++) {
            Deque <Integer> temp = new ArrayDeque<>();
            temp.add(priorities[i]);
            temp.add(i);
            d.add(temp);
        }
        
        for(int i = rank.length - 1; i >= 0; i--) {
            while(d.peek().peek() != rank[i])
                d.addLast(d.remove());
            if(d.peek().peekLast() == location) {
                answer = rank.length - i;
                break;
            }
            d.remove();
        }
        return answer;
    }
}

2. 설명

int answer = 0;
int[] rank = priorities.clone();
Arrays.sort(rank);

rank에 우선순위를 기준으로 오름차순으로 정렬합니다.(내림차순으로 하는 것이 더 좋지만 Integer가 아님으로 오름차순으로 정렬)

Deque <Deque<Integer>> d = new ArrayDeque<>();
for(int i = 0; i < priorities.length; i++) {
    Deque <Integer> temp = new ArrayDeque<>();
    temp.add(priorities[i]);
    temp.add(i);
    d.add(temp);
}

덱에 우선순위와 위치 정보를 같이 저장합니다.

for(int i = rank.length - 1; i >= 0; i--) {
    while(d.peek().peek() != rank[i])
        d.addLast(d.remove());
    if(d.peek().peekLast() == location) {
        answer = rank.length - i;
        break;
    }
    d.remove();
}

우선순위가 높은 순서부터 진행하는데 우선순위와 덱의 첫번째 우선순위가 동일하지 않으면 덱의 우선순위가 제일 높은 것이 아님으로 제일 높은 우선순위가 나올 때까지 뒷부분에 추가합니다.

만약 우선순위가 덱 내에서 제일 높은데 location과 위치정보가 동일하다면 answer 값을 i와 rank의 길이를 이용하여 도출한 뒤 종료합니다.

3. 정리

  1. 내림차순으로 정렬이 안된 것 말고는 특별한 것이 없다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges