개발 공부~

[Queue] 응급실 .java 본문

코딩테스트/기타

[Queue] 응급실 .java

머밍 2024. 11. 5. 20:14

설명

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

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

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

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

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

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

현재 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