파이썬 알고리즘 037 | 응급실(큐) **

Yunny.Log ·2021년 1월 13일
0

Algorithm

목록 보기
37/318
post-thumbnail

37. 응급실

메디컬 병원 응급실에는 의사가 한 명밖에 없습니다.
응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조
치를 의사가 해야 합니다. 이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의
진료순서를 정합니다.
• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.
• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로
다시 넣습니다. 그렇지 않으면 진료를 받습니다.
현재 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 0
60 60 90 60 60 60
▣ 출력예제 2
5

<내 풀이>

  • 접근 방법을 알 듯하면서 모르겠는 문제
  • 순환시켜주는 걸 큐를 이용해서 한다는 걸 알겠는데 (a[0]자리가 max(a)될때 까지 a.append(a.popleft()) 하다가 max[0]자리 되면 그냥 a.popleft() 하기) 어떻게 a[m]이 max(a)가 되었는지 알 수 있는 방법을 모르겠다
    (특히 60 여러개 있는 경우처럼 다 똑같을 때 어떻게 구분할 수 있는건지..)

from collections import deque
n, m = map(int, input().split())
a=list(map(int, input().split()))
a=deque(a)
cnt=0
while a:
    if a[0] == max(a) :
        a.popleft()
        cnt+=1
        print(a)
    else : 
        a.append(a.popleft())
        

==> 이렇게 나온다 (a 변해가는 과정..)
deque([60, 50, 70, 80])
deque([60, 50, 70])
deque([60, 50])
deque([50])
deque([])
=> 이걸 응용해보려고 했는데 두번째 입력예제 같은 데에선 다 똑같은 60이라서 어떻게 해야할 지를 모르겠다
=====>처음에 a값을 받을 때 인덱스값, 값 이렇게 두개 받으면 된다
enumerate사용하거나 for 구문 사용

<풀이>


from collections import deque

n,m=map(int, input().split())
a=[(k,v) for k,v in enumerate(list(map(int, input().split())))]
a=deque(a)
cnt=0
while True:
    k=a.popleft()
    if any(k[1] < x[1] for x in a) :
        a.append(k)
    else : 
        cnt+=1
        if k[0]==m :
            break
print(cnt)

<다른 분의 풀이>

from collections import deque

n,m=map(int, input().split())
lst=list(map(int, input().split()))
lst=[(lst[i],i) for i in range(n)] 
#이렇게 하면 deque([(60, 0), (60, 1), (90, 2), (60, 3), (60, 4), (60, 5)]) 이렇게 지정이 된다
# 또한 print(max(lst)[1]) , print(max(lst)[0]) 했을 때 2, 90이라고 나온다
lst=deque(lst)
res=[]

while True:
    if lst[0][0]<max(lst)[0]:
        pt=lst.popleft()
        lst.append(pt)
        
    else:
        pt=lst.popleft()
        res.append(pt)
        
        if res[-1][1]==m:
            break
print(len(res))

<반성점>

  • 지정된 인덱스 값의 흐름을 쭉 따라가야 하는데 그 인덱스 번호가 계속 바뀌면
    값을 받을 때 enumerate 로 지정해주면 된다 인덱스 번호
  • 근데 (k, v) 이렇게 저장할 때 무조건 k 기준으로 크기 비교된다..
  • 분명 어렵지 않은 문젠데 list 받을 때 인덱스 값이랑, 값으로 받는 부분이 어려웠고 여기서 최댓값을 구하는 걸 어떻게 해야하는지 몰랐다

<배운 점>

  • a=[(k,v) for k, v in enumerate(list(map(int, input().split())))]
    이렇게 해주고 a를 프린트 하면
    => deque([(0, 60), (1, 60), (2, 90), (3, 60), (4, 60), (5, 60)])
    이렇게 잘 출력이 된다

  • 이런 방법도 있다

0개의 댓글