PS(Java)/인프런 강의 문제

[PS] 인프런 강의 - Stack & Queue 8. 응급실

UL :) 2022. 11. 9. 16:16

 

문제

메디컬 병원 응급실에는 의사가 한 명밖에 없습니다.

응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야 합니다.

이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.

 

• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.

• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣습니다. 그렇지 않으면

진료를 받습니다.

 

즉 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조입니다.

현재 N명의 환자가 대기목록에 있습니다.

N명의 대기목록 순서의 환자 위험도가 주어지면, 대기목록상의 M번째 환자는 몇 번째로 진료를 받는지 출력하는 프로그램을 작성하세요.

대기목록상의 M번째는 대기목록의 제일 처음 환자를 0번째로 간주하여 표현한 것입니다.

 

▣ 입력설명

첫 줄에 자연수 N(5<=N<=100)과 M(0<=M<N) 주어집니다.

두 번째 줄에 접수한 순서대로 환자의 위험도(50<=위험도<=100)가 주어집니다.

위험도는 값이 높을 수록 더 위험하다는 뜻입니다. 같은 값의 위험도가 존재할 수 있습니다.

 

▣ 출력설명

M번째 환자의 몇 번째로 진료받는지 출력하세요.

 

▣ 입력예제 1
5 2
60 50 70 80 90


▣ 출력예제 1
3


▣ 입력예제 2
6 3

70 60 90 60 60 60


▣ 출력예제 2
4

 

풀이

풀이 자체는 간단해서 뼈대 로직은 다 짰는데

순서를 어떻게 저장하나... m번째만 따로? 아니면 같이? 싶어서 강의 봤더니

Person 클래스를 만들어서, 큐에 제너릭타입으로 지정하는 식으로 푸셨더라.

난 이걸 왜 생각못하는 건지 ㄱ- 바보야 바봅

 

코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Person{
	int id; //순서
	int priority; //위험도 높은 순서
	
	Person(int id, int priority){
		this.id = id;
		this.priority = priority;
	}
}

public class Main {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		int n = in.nextInt(); //대기 환자수
		int m = in.nextInt(); //m번째 환자는 몇번째로 진료받는지?
		Queue<Person> Q = new LinkedList<>();//접수 순서대로 환자의 위험도(중복 가능)
		
		for(int i=0; i<n; i++) Q.offer(new Person(i, in.nextInt()));
		
		int answer = 0; //진료 순서
		while(!Q.isEmpty()) { //큐 순회
			Person tmp = Q.poll(); //맨 앞을 뽑는다
			for(Person p : Q) {
				if(p.priority > tmp.priority) { //위험도 더 높은 환자 존재 -> 맨뒤로
					Q.offer(tmp);
					tmp = null; //주의! 플래그 역할
					break;
				}
			}
			//진료
			if(tmp != null) {
				answer++;
				if(tmp.id == m) break;
			}
		}
		System.out.print(answer);
	}
}