반응형
    
    
    
  
                              Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        
                    | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
                            Tags
                            
                        
                          
                          - 티스토리챌린지
 - 퍼즐 조각 채우기
 - 카카오
 - 수료
 - 설명
 - 24955
 - SSAFY
 - 인턴십
 - 백준
 - 오블완
 - 후기
 - 정기 코딩 인증평가
 - 프로그래머스
 - PCCP
 - 산 모양 타일링
 - softeer
 - 142085
 - SQL
 - java
 - 해결
 - 배열 돌리기 5
 - 14942
 - 10기
 - 카카오코드 본선
 - MySQL
 - 핵심
 - 소프티어
 - 숫자 이어 붙이기
 - 싸피
 - 등산코스 정하기
 
                            Archives
                            
                        
                          
                          - Today
 
- Total
 
개발 쥬스
[프로그래머스/Java] 42587 프로세스 본문
반응형
    
    
    
  https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
고찰 과정
문제를 봤을 때 단순하게 우선순위 큐를 활용하는 방법도 있겠지만 추가적인 확인 작업도 필요했기에 deque를 활용하여 문제를 해결했습니다.
예를 들어서 프로세스 [A, B, C, D, E, F]가 존재하고 우선순위가 [1, 1, 9, 1, 1, 1]이 있을 때 A의 순서 번호를 구한다고 가정해봅시다.
당연히 C가 먼저 실행되지만 그 다음 실행되어야 하는 순서는 A, B, D, E, F 순이 아닌 C가 실행한 이후의 실행 순서를 마무리 한 후인 D, E, F, A, B 순으로 실행이 되어야 하므로 이를 deque를 활용하면 다음과 같은 순서로 A의 순번을 도출할 수 있습니다.
- priorities 배열에서 특정 우선순위가 몇 번 나왔는지 저장하는 배열 priorityInfos를 만들고 정보를 저장한다.
 - priorityInfos 배열을 꺼내어 deque에 담는다.
 - 다음과 같은 순서로 A의 순서를 도출한다.
a. deque에서 맨 앞(왼쪽)의 우선순위 정보를 꺼낸다.
b. priorityInfos를 활용하여 이 우선순위 보다 큰 우선순위가 존재하는지 확인한다. 존재한다면 deque의 맨 마지막(오른쪽)에 다시 넣어주고 최고 우선순위라면 순번을 카운트 해주고 priorityInfos에서 해당 우선순위의 존재 개수에서 하나 빼준다. 
위의 과정들을 코드로 작성하면 됩니다.
코드
import java.util.*;
class Process {
    private final int index;
    private final int priority;
    
    public Process(int index, int priority) {
        this.index = index;
        this.priority = priority;
    }
    
    public int getIndex() {
        return index;
    }
    
    public int getPriority() {
        return priority;
    }
}
class Solution {
    
    private static final int MAX_VALUE = 10;
    
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int pLen = priorities.length;
        int[] priorityInfos = new int[MAX_VALUE];
        
        for (int priority : priorities) {
            ++priorityInfos[priority];
        }
        
        Deque<Process> deque = new ArrayDeque<>();
        
        for (int i = 0; i < pLen; ++i) {
            deque.addLast(new Process(i, priorities[i]));
        }
        
        while (!deque.isEmpty()) {
            Process process = deque.pollFirst();
            int curIdx = process.getIndex();
            int curPriority = process.getPriority();
            
            if (existMorePriority(curPriority, priorityInfos)) {
                deque.offerLast(new Process(curIdx, curPriority));
                continue;
            }
            
            ++answer;
            
            if (curIdx == location) {
                break;
            }
            
            --priorityInfos[curPriority];
        }
        
        return answer;
    }
    
    private boolean existMorePriority(final int priority, final int[] priorityInfos) {
        for (int curP = priority + 1; curP < MAX_VALUE; ++curP) {
            if (priorityInfos[curP] > 0) {
                return true;
            }
        }
        
        return false;
    }
}반응형
    
    
    
  '알고리즘' 카테고리의 다른 글
| [백준/Java] 4358 생태학 (0) | 2024.08.08 | 
|---|---|
| [백준/Java] 1189번 컴백홈 (0) | 2024.08.08 | 
| [백준/Java] 1374번 강의실 (0) | 2024.08.05 | 
| [백준/Java] 1034번 램프 (0) | 2024.08.03 | 
| [백준/Java] 1027번 고층 건물 (0) | 2024.08.03 |