[큐] 8. 응급실
by 개발하는지호설명
메디컬 병원 응급실에는 의사가 한 명밖에 없습니다.
응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야 합니다.
이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.
• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.
• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣습니다. 그렇지 않으면 진료를 받습니다.
즉 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조입니다.
현재 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
<<풀이>>
-나의 풀이-
나는 나름대로 의사코드를 작성했는데 과정은 조금 복잡하다. 그래도 어느정도 논리적이라고 생각은 했지만
가장 큰값인지 아닌지 반환하는 다른 메서드를 만드는 과정에서 큐에는 get() 메서드가 없음을 알게 되었다. 근데 지금 생각해보면 되는 경우가 있을 수도 있겠다.!!! 상향된 for문을 활용하는 것이다. 일단 나중에 다시 해보겠다.
import java.util.*;
class Main {
private boolean isMax(int k, Queue<Integer> Q){
for(int i = 0; i < Q.size(); i++) {
Q.get(i) //여기서 막힘 ㅠㅠ stack은 가지고 있지만 큐는 이 메서드를 사용할 수가 없다.
}
}
private int solution(int n, int m, int[] arr) {
Queue<Integer> Q = new LinkedList<>();
int count = m, rank = 0;
boolean run = true;
while(run) {
if(!isMax(Q.peek(), Q)) Q.offer(Q.poll());
else {
Q.poll();
rank++;
count--;
}
if(count == 0 && isMax(Q.peek(), Q)) {
run = false;
}
}
return rank;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
System.out.println(T.solution(n, m, arr));
}
}
-강사님 풀이-
이번 풀이는 조금 놀랐다. 물론 모르는 것은 아니지만, 코테에서 보니까 또 색달랐다. 바로 따로 클래스를 만들어서 구했다는 점이다. 나는 처음에 어떻게 특정값을 지정할까?? 라는 생각을 가졌지만 도저히 생각이 나지가 않아 특단의 조치로 어떤 변수를 지정해서 그것에 의존하면서 특정한 값을 구하려고 했다.(위의 방식을 참고하면 된다.)
하지만 강사님은 깔끔하게 클래스 Person으로 지정해두고 그 Queue의 제네릭을 Person으로 두어서 객체를 넣어주었다. ㅋㅋ
나름 센세이션이었다 ㅋㅋ
그리고, 헷갈릴 수가 있는게, Q.offer(new Person(i, arr[i])) 이 부분이다.
하지만 우리는 변수가 들어가야 한다고 생각하지만, 변수가 바로 new Person(i, arr[i]) 이것을 참조하기 때문에 같은 것이라고 해도 무방하다. 그렇기 때문에 굳이 변수를 만들어서 넣을 필요가 없고 이렇게 바로 넣어도 되는 것이다.
그렇게 해서 객체를 넣어주고 비교하기 시작한다.
그리고 여기서 또 좋은 아이디어는 tmp를 사용한 것이다.
일시적으로 poll한 값을 가지고 있다가 다시 넣어야 할 때 offer(tmp)를 해주면 된다. 이렇게 하면
최종적으로 tmp의 순서 값이 우리가 구하고자하는 순서값과 비교를 좀 더 효율적으로 할 수 있다.
단지 poll만 하면 끝날거 같았던 나의 생각을 바꿔줬다 ㅋㅋ
import java.util.*;
class Person {
int id;
int priority;
public Person(int id, int priority) {
this.id = id;
this.priority = priority;
}
}
class Main {
private int solution(int n, int m, int[] arr) {
int answer = 0;
Queue<Person> Q = new LinkedList<>();
for(int i = 0; i < n; i++) {
Q.offer(new Person(i, arr[i]));
}
while(!Q.isEmpty()) {
Person tmp = Q.poll();
for(Person x : Q) {
if(x.priority > tmp.priority) {
Q.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 in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
System.out.println(T.solution(n, m, arr));
}
}
이렇게 문제를 풀어 보았는데, 이 문제는 또 나의 생각을 바꿔주는 계기가 된 것 같다.
오늘도 잘 배우고 갑니당~~
'코딩테스트' 카테고리의 다른 글
[인프런_선택 정렬] 1. 선택 정렬 (0) | 2024.01.15 |
---|---|
[백준 누적합] 11659번: 구간 합 구하기 4 (3) | 2024.01.14 |
[큐] 7. 교육과정 설계 (1) | 2024.01.13 |
[큐] 6. 공주 구하기 (1) | 2024.01.13 |
[스택] 5. 쇠막대기 (1) | 2024.01.13 |
블로그의 정보
DevSecOps
개발하는지호