메디컬 병원 응급실에는 의사가 한 명밖에 없음
응급실은 환자가 도착한 순서대로 진료를 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야함
이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정함:
• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼내고
• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣기. 그렇지 않으면 진료를 받음
현재 N명의 환자가 대기목록에 있음
N명의 대기목록 순서의 환자 위험도가 주어지면, 대기목록상의 M번째 환자는 몇 번째로 진료를 받는지 출력하는 프로그램 작성
대기목록상의 M번째는 대기목록의 제일 처음 환자를 0번째로 간주하여 표현
▣ 입력설명
첫 줄에 자연수 N(5<=N<=100)과 M(0<=M<N) 주어짐
두 번째 줄에 접수한 순서대로 환자의 위험도(50<=위험도<=100)가 주어짐
위험도는 값이 높을 수록 더 위험하다는 뜻, 같은 값의 위험도가 존재할 수 있음
▣ 출력설명
M번째 환자가 몇 번째로 진료받는지 출력
▣ 입력예제
1 52
60 50 70 80 90
▣ 출력예제
1 3
▣ 입력예제 2
6 0
60 60 90 60 60 60
▣ 출력예제
2 5
내가 쓴 코드
import sys
from collections import deque
sys.stdin = open("input.txt",'rt')
N, M = map(int, input().split())
risks = deque(list(map(int, input().split())))
#포인터 개념을 이용해서 타겟 환자의 인덱스를 추적
pointer = M
cnt = 0
while True:
#타겟 환자 순서일 때
if pointer == 0:
#근데 위험도 더 높은 환자 존재에서 맨뒤로 줄
tmp = risks.popleft()
if tmp < max(risks):
risks.append(tmp)
pointer = len(risks) - 1
#진료 받을 수 있음: 가장 위험도 높음
else:
cnt += 1
result = cnt
break
#타겟 환자 아닌 다른 환자 순서일 때
else:
#근데 맨뒤로 줄
tmp = risks.popleft()
if tmp < max(risks):
risks.append(tmp)
pointer -= 1
#진료 받기
else:
cnt += 1
pointer -= 1
#몇 번째 인지 니까 +1
print(result)
모범답안
import sys
from collections import deque
sys.stdin = open("input.txt",'rt')
n,m = map(int, input().split())
Q = [(pos, val) for pos, val in enumerate(list(map(int, input().split())))]
Q = deque(Q)
cnt = 0
while True:
cur = Q.popleft()
# 진료 순서 안됨: 더 위험한 환자 있을 때 -> 맨뒤로 줄
if any(cur[1] < x[1] for x in Q):
Q.append(cur)
# 진료 순서임: 더 위험한 환자 없음
else:
cnt += 1
if cur[0] == m:
print(cnt)
break
느낀점
1. 우선 너무 뿌듯하다!!!!!!악!
지피티 피셜 실버 3정도의 쉬운 문제지만 그래도 빠르고 예쁘게 푼것 같다 물론 아직 모범답안 안봤지만.ㅎ
포인터를 이용해서 타겟환자의 인덱스를 추적하는 방법을 통해
동일한 위험도를 가진 다른 환자들과 구분해낼 수 있는 방법을 매우.빠르게 생각해냄!!!
2. 우선 모범답안은 인덱스를 포인터로 추적하지 않고, 처음에 인덱스와 값을 enumerate로 튜플에 넣고,
그 튜플들이 담긴 리스트를 deque로 다루는 방법을 택했다. 생각을 안했던건 아니지만
이 방법도 쓰는 방법을 익혀야 겠다.
3. 내 코드도 보면 타겟환자인 경우와 아닌 경우를 굳이 처음부터 나눠서 99프로 유사한 코드를
굳이 두번 쓸 필요가 없었다. 좀 더 짧고 효율적으로 구현할 수 있었는데 아숩당.
4. any함수도 익숙해지자! any()안에 있는 어떤 것 이라도 참이면 참 .. or 조건의 나열이라고 생각
다시 풀어보기
import sys
from collections import deque
#sys.stdin = open("input.txt",'rt')
#입력 받기
N, M = map(int, input().split())
risks = deque(list((idx, val) for idx, val in enumerate(list(map(int, input().split())))))
cnt = 0
while True:
tmp = risks.popleft()
#진료 순서 안됨: 더 위험한 환자 존재
if any(tmp[1] < x[1] for x in risks):
risks.append(tmp)
#진료 순서임: 더 위험한 환자 없음
else:
cnt += 1
#타겟환자인 경우 종료
if tmp[0] == M:
print(cnt)
break