Post

Queue_class정의해서 순서 알아내기

✅ 병원에 환자가 진료를 볼 순서를 구하세요

환자가 도착한 순서대로 진료를 한다.
단, 위험도가 높은 환자는 먼저 진료를 받는다.

  • 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼낸다
  • 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣는다. 그렇지 않으면 진료를 받는다.
  • 즉 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조
    현재 N명의 환자가 대기 목록에 있을 때, M번째 환자는 몇 번째로 진료를 받는지 구하세요
    M번째 환자는 대기목록의 제일 처음 환자를 0으로 간주하여 표현한 것이다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class Person {
    int id;
    int priority;

    public Person(int id, int priority) {
        this.id = id;
        this.priority = priority;
    }
}

class Main {

    public int solution(int n, int m, int[] input){
        int answer= 0;
        Queue<Person> queue= new LinkedList<>();
        for(int i=0; i<n; i++) queue.offer(new Person(i, input[i]));

        while(!queue.isEmpty()){
            Person tmp= queue.poll();
            for(Person p: queue) {
                if (tmp.priority < p.priority) {
                    queue.offer(tmp);
                    tmp = null;
                    break;
                }
            }
            if (tmp != null) {
                answer++;
                if (tmp.id == m) return answer;
            }
            }

        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[] input= new int[n];
        for(int i=0; i<n; i++){
            input[i]= sc.nextInt();
        }
        System.out.print(T.solution(n, m, input));

    }
}
//⭐️input:
5 2
60 50 70 80 90
//⭐️output:
3
//⭐️input:
6 3
70 60 90 60 60 60
//⭐️output:
4
  1. Person이라는 class를 정의한다.
  2. 그리고 만든 queuePerson의 아이디와 우선순위를 저장할 것이다.
  3. queue가 비어있지 않을 때
  4. queue에서 가장 첫 번째 사람을 뽑고 queue.poll();
  5. 그 다음 queue를 돌면서 나머지 사람이랑 우선순위를 비교한다.
  6. (경우1) 만약 첫 번째 사람이 우선순위가 높다면 그 사람이 그냥 진료 받음
  7. 그리고 answer++;
  8. (경우2) 만약 첫 번째 사람보다 우선 순위가 높은 사람이 뒤에 있으면
  9. 첫 번째 사람은 맨 뒤로 간다.
  10. 그리고 뽑은 사람은 다시 초기화 null
  11. 만약 첫 번째 사람보다 우선 순위가 높은 사람이 한 사람이라도 있으면 있는 거니까 그만 찾음. break;
  12. 그리고 계속 poll()을 시키다가, poll한 사람의 아이디가 우리가 찾는 아이디 m과 일치하면 출력

🔵 ThingsILearned

✔️ 필요할 경우, 내가 원하는 class를 정의해서 사용할 수 있다.

This post is licensed under CC BY 4.0 by the author.