문제
- 메디컬 병원 응급실에는 의사가 한 명밖에 없습니다.
- 응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야 합니다.
- 이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.
- > 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.
- > 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣습니다. 그렇지 않으면 진료를 받습니다.
- 즉 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조입니다.
- 현재 N명의 환자가 대기목록에 있습니다.
- N명의 대기목록 순서의 환자 위험도가 주어지면, 대기목록상의 M번째 환자는 몇 번째로 진료를 받는지 출력하는 프로그램을 작성하세요.
- 대기목록상의 M번째는 대기목록의 제일 처음 환자를 0번째로 간주하여 표현한 것입니다.
입력
- 첫 줄에 자연수 N(5<=N<=100)과 M(0<=M<N) 주어집니다.
- 두 번째 줄에 접수한 순서대로 환자의 위험도(50<=위험도<=100)가 주어집니다.
- 위험도는 값이 높을 수록 더 위험하다는 뜻입니다. 같은 값의 위험도가 존재할 수 있습니다.
출력
- M번째 환자의 몇 번째로 진료받는지 출력하세요.
입출력 예제
풀이방식
이번 문제는 Queue(큐), 배열, 클래스를 사용하여 푸는 문제이다.
설계과정
1. 대기 목록 상의 환자 번호와 위험도를 큐에 넣는다.
2. 맨 처음 환자를 큐에서 꺼내서 임의의 변수에 넣는다.
3. 대기 목록에서 처음 환자보다 위험도가 높은 환자가 있는지 확인한다.
4. 높은 환자가 있으면 처음 환자의 위험도를 큐 맨 뒤에 넣는다.
5. 만약 처음 환자의 위험도가 가장 높다면 결과값을 누적한다.
6. M 번째 환자가 위험도가 가장 높게 되면, 누적된 결과값을 리턴한다.
풀이과정
1. 값들을 입력받는 코드를 작성한다.
2. int 형으로 메소드를 작성한다.
3. Person 클래스를 만들고, 객체를 생성하여 초기화한다.
- 큐에 값을 넣을 때에 대기 목록 상의 환자 번호와 위험도를 같이 넣기 위해 클래스를 생성한다.
- 이 때 클래스에는 환자 번호를 의미하는 id 와 위험도를 의미하는 priority 객체를 선언하고 초기화한다.
- id() : 대기 목록 상의 환자 번호
- priority() : 위험도
4. 클래스 객체형을 가지는 Q를 선언하고, 값을 넣는다.
- offer() : 순차적으로 값을 넣는다.
- 예제 상으로 Person(i, arr[i]) 에는 (0, 60), (1, 50), (2, 70), (3, 80), (4, 90) 이라는 값이 들어가게 된다.
- 즉 아래 이미지와 같이 Q에 값이 들어간다.
5. 큐에 값이 없을 때까지 도는 while 문을 선언한다.
- isEmpty() : 값이 비었는지 확인하여 true / false로 리턴한다.
6. 큐에 들어간 맨 처음 환자를 꺼내서 임의의 변수 tmp에 저장한다.
- poll() : 가장 먼저 보관한 값을 꺼내고 반환한다.
- tmp에는 id = 0 / priority = 60 이 들어간다.
7. x가 Q보다 위험도가 크면 큐에 tmp 값을 넣고 break를 통해 끝낸다.
- 해당 환자가 위험도가 적어 진료를 볼 수 없음이 확인되면 더 탐색할 필요가 없으므로 break를 통해 끝낸다.
- 해당 과정을 반복하면 아래 이미지와 같은 결과를 볼 수 있다. (10번을 수행한 결과이다.)
8. 환자가 진료를 받을 수 있으면 결과에 1씩 누적한다.
- tmp가 null이 아니라는 것은 즉 진료를 받을 수 있는 환자라는 의미이다.
- 앞에 환자가 진료를 받은 횟수만큼 누적하도록 result를 1씩 누적한다.
9. M 번째 환자가 진료를 받을 수 있으면 누적된 결과값을 출력한다.
해당 글은 인프런 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.
'알고리즘 > 인프런' 카테고리의 다른 글
섹션 6. Sorting and Searching(정렬, 이분검색과 결정알고리즘) 2. 버블정렬 (0) | 2022.10.30 |
---|---|
섹션 6. Sorting and Searching(정렬, 이분검색과 결정알고리즘) 1. 선택정렬 (0) | 2022.10.30 |
섹션 5. Stack, Queue(자료구조) 7. 교육과정 설계 (0) | 2022.10.24 |
섹션 5. Stack, Queue(자료구조) 6. 공주구하기 (2) | 2022.10.24 |
섹션 5. Stack, Queue(자료구조) 5. 쇠막대기 (0) | 2022.10.23 |