개발 공부~
[Queue] 응급실 .java 본문
설명
메디컬 병원 응급실에는 의사가 한 명밖에 없습니다.
응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야 합니다.
이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.
• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.
• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣습니다. 그렇지 않으면 진료를 받습니다.
즉 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조입니다.
현재 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
내 풀이
1. 환자의 번호와 위험도를 함께 큐에 저장해야 하기에 정수형 배열을 큐의 원소로 설정
2. 큐가 빌 때까지 검사 -> 하나를 꺼내서 탐색
3. 현재 환자의 위험도보다 더 높은 환자가 큐에 있는지 확인
-> 있으면 뒤에 넣기
-> 없으면 진료 보는 것이기 때문에 정답인 진료순서를 하나 증가, 이때의 환자번호가 m과 같으면 정답이기에 break로 나오기
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
//번호와 위험도를 같이 저장할 배열을 원소로 가짐
Queue<int[]> q = new LinkedList<>();
for(int i = 0; i < n; i++){
int risk = sc.nextInt();
//환자 시작은 0부터
q.offer(new int[]{i, risk});
}
int answer = 0;
while(!q.isEmpty()){
//하나 꺼내서 확인
int[] pat = q.poll();
int index = pat[0];
int pr = pat[1];
//자기보다 위험도가 높은 환자가 있는지 판별
boolean find = false;
for(int[] i : q){
if(i[1] > pr) {//있으면
q.offer(pat);//현재 환자를 다시 큐에 넣기
find = true;
break;
}
}
if(!find){//없으면
answer++;//진료함
if(index == m) {//m번째 환자이면
break;
}
}
}
System.out.print(answer);
}
}
다른 풀이
클래스로 환자의 정보(번호, 위험도)를 설정한 점,
현재 person 객체인 cnt를 값으로도 사용하고 현재 환자보다 높은 우선순위를 가졌는지까지 판별하도록 구현한 점이 다르다
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Person{//환자 정보를 담는 클래스
int id;
int priority;
public Person(int id, int priority) {
this.id = id;
this.priority = priority;
}
}
public class Main {
public int solution(int n, int m, int[] arr){
int answer = 0;
Queue<Person> q = new LinkedList<>();
for(int i = 0; i < n; i++){
q.add(new Person(i, arr[i]));
}
while(!q.isEmpty()){
Person cnt = q.poll();
for(Person x: q){//큐의 모든 환자 탐색
if(x.priority > cnt.priority){//우선순위가 현재 환자보다 높은 환자가 있다면
q.offer(cnt);//현재 환자 다시 큐에 넣고
cnt = null;//cnt 값으로 환자 있는지 판별
break;
}
}
if(cnt != null){//높은 환자가 없다면
answer++;//진료 보니까 하나 증가
if(cnt.id == m) return answer;//m번째면 정답
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] arr = new int[n];
for(int i =0; i < n; i++){
arr[i] = sc.nextInt();
}
System.out.print(T.solution(n,m,arr));
}
}
💡💡
큐 안에 클래스를 생성해서 넣는 게 더 간단히 구현할 수 있는 것을 알게 된 문제였다
'코딩테스트 > 기타' 카테고리의 다른 글
[정렬] 삽입 정렬 .java (0) | 2024.11.06 |
---|---|
[정렬] 선택 정렬 .java (0) | 2024.11.06 |
[Queue] 교육과정 설계 .java (1) | 2024.11.05 |
[Queue] 공주 구하기 .java (0) | 2024.11.05 |
[Stack] 쇠막대기 .java (0) | 2024.11.05 |