[코딩테스트] programmers - 프로세스 (알고리즘 고득점 kit) [JAVA]

2025. 3. 16. 17:05·코딩테스트
728x90
반응형
SMALL

문제링크

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

 

프로그래머스

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

programmers.co.kr


문제설명

운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
  3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.


제한사항

  • priorities의 길이는 1 이상 100 이하입니다.
    • priorities의 원소는 1 이상 9 이하의 정수입니다
    • priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
  • location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.
    • priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이 표현합니다.

입출력 예시


최종코드

package STACK_QUEUE;

import java.util.*;

public class Process {
	 public int solution(int[] priorities, int location) {
		 int answer = 0;
		 
		 // (인덱스, 우선순위) 형태로 큐에 삽입 
		 Queue<int[]> queue = new LinkedList<int[]>();
		  
		 // 숫자 큰 순서부터 우선순위 ! 내림차순 정렬 
		 PriorityQueue<Integer> maxPri = new PriorityQueue<>(Collections.reverseOrder());
		 
		 for(int i=0; i<priorities.length; i++) {
			 // 큐 삽입 (인덱스, 우선순위)
			 queue.add(new int[]{i,priorities[i]});
			 // 우선순위큐 삽입 (우선순위만)
			 maxPri.add(priorities[i]);
			 
		 }
		 
		 // 작업시작 
		 while(!queue.isEmpty()) {
			 // 현재 작업 프로세스 [0,2] ==> [인덱스, 우선순위] ==> cur[1]과 우선순위 비교
			 int[] cur = queue.poll();
			 
			 if(cur[1] == maxPri.peek()) { // 우선순위 가장 높은 프로세스가 맞다면
				 answer++; // 작업 실행
				 maxPri.poll(); // 우선순위 큐에서 해제 
			 
				 if(cur[0] == location) { // 내가 찾고있는 프로세스가 일치한다면 answer 반환
					 return answer;
				 }
			 } else { // 우선순위 작업이 아니라면 다시 큐에 삽입
				 queue.add(cur);
			 }
		 }
		 
		 return answer;
	 }
}

 

이 문제는 우선순위가 높은 프로세스부터 처리해야하는 문제이다.

해결 흐름

1. 프로세스를 순차적으로 탐색하여 우선순위 확인

  • 일반 큐에 (인덱스, 우선순위) 형태로 저장하여 원래 위치 정보를 유지한다.
  • 우선순위 큐에 우선순위만 저장하여 가장 높은 우선순위를 빠르게 찾는다.

2. 현재 프로세스를 실행할건지 결정

  • poll()을 사용하여 큐에서 가장 앞의 프로세스를 꺼낸다.
  • 꺼낸 프로세스의 우선순위와 현재 가장 높은 우선순위를 비교한다.
  • 우선순위가 높다면 실행 (answer++) 하고 해당 우선순위를 제거(maxPriority.poll())한다.
  • 우선순위가 낮다면 다시 큐의 뒤로 이동(queue.add(cur))시킨다.

3. 특정 프로세스의 실행 순서 확인

  • 실행된 프로세스의 index가 목표 location과 같다면 즉시 return.
  • 모든 프로세스를 실행할 때 까지 반복, 실행된 순서를 추적하여 정답을 구하기.
728x90
반응형
LIST

'코딩테스트' 카테고리의 다른 글

[코딩테스트] 백준 11653- 소인수분해 [JAVA]  (0) 2025.03.16
[코딩테스트] programmers - 올바른 괄호 (알고리즘 고득점 kit) [JAVA]  (0) 2025.03.14
[코딩테스트] programmers - 기능 개발 (알고리즘 고득점 kit) [JAVA]  (0) 2025.03.13
[코딩테스트] programmers - 같은 숫자는 싫어 (알고리즘 고득점 kit) [JAVA]  (0) 2025.03.11
[코딩테스트] programmers - 완주하지 못한 선수(알고리즘 고득점 kit) [JAVA]  (1) 2025.02.02
'코딩테스트' 카테고리의 다른 글
  • [코딩테스트] 백준 11653- 소인수분해 [JAVA]
  • [코딩테스트] programmers - 올바른 괄호 (알고리즘 고득점 kit) [JAVA]
  • [코딩테스트] programmers - 기능 개발 (알고리즘 고득점 kit) [JAVA]
  • [코딩테스트] programmers - 같은 숫자는 싫어 (알고리즘 고득점 kit) [JAVA]
junhyeokkk
junhyeokkk
나의 개발자 성장기
  • junhyeokkk
    백엔드 개발자 준혁의 성장일지
    junhyeokkk
  • 전체
    오늘
    어제
    • 분류 전체보기 (59)
      • Flutter (13)
      • 개발환경구축 (3)
      • HTTP (0)
      • CS지식 (5)
      • 코딩테스트 (10)
      • JAVA (7)
      • 데이터베이스 (7)
      • Node.js (9)
      • TypeScript (1)
      • Azure (3)
      • Git (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Java
    코딩테스트
    마이크로소프트sql
    Typescript
    데이터베이스
    Microsoft
    CS지식
    자바
    개발자준비
    node
    백엔드개발자
    programmers
    cosmos db
    RDBMS
    sql튜토리얼
    백엔드개발
    라이브러리
    js
    node.js
    개발자
    db
    백엔드
    Flutter
    MSsql
    nodejs
    디자인패턴
    알고리즘
    DART
    azure
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
junhyeokkk
[코딩테스트] programmers - 프로세스 (알고리즘 고득점 kit) [JAVA]
상단으로

티스토리툴바