본문 바로가기
알고리즘 (Python)

응급실(큐)

by ppirae 2022. 3. 30.

인프런 김태원님의 파이썬 알고리즘 문제풀이를 듣고 작성한 글입니다.

https://inf.run/3G7S

 

파이썬 알고리즘 문제풀이 (코딩테스트 대비) - 인프런 | 강의

파이썬을 이용한 코딩테스트 문제풀이를 합니다., - 강의 소개 | 인프런...

www.inflearn.com

내 풀이 (정답 아님)

from collections import deque
#내 풀이
n, m = map(int, input().split())
a = list(map(int, input().split()))
a = deque(a)
target = a[m]
cnt = 0

while True:
    tmp = a.popleft()
    if tmp[1] >= max(a[1]):
        cnt += 1
    else:
        a.append(tmp)
    if target not in a:
        break
print(cnt)

테스트케이스1은 통과했지만

같은 값의 위험도가 존재할때 오류가 생긴다.

target 이 아닌 다른 방안을 생각해야 한다.


강의 풀이

from collections import deque
#강의 풀이
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 cnt[0] == m:
            print(cnt)
            break

일단 입력을 받을때

강사님은 enumerate를 이용하여 (순서, 위험도값)을 한번에 입력받는 방식을 사용하였다.

그 이후 any 함수는 조건에 해당하는 값이 하나라도 있으면 참이 된다.

현재 popleft 한 위험도보다 큰 위험도가 큐에 있다면 맨뒤에 넣고,

popleft 값보다 큰 위험도가 없다면 그대로 순서를 +1 한다.

이후, cnt[0] -> 순서가 처음에 입력받은 n과 같다면 출력후 반복문을 탈출한다.

 

enumerate의 활용성을 기억하자

 

똑같은 문제

https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

'알고리즘 (Python)' 카테고리의 다른 글

합이 같은 부분집합 (DFS)  (0) 2022.04.01
부분집합 구하기 (DFS)  (0) 2022.04.01
후위 표기식 만들기(스택)  (0) 2022.03.30
쇠막대기(스택)  (0) 2022.03.30
가장 큰 수(스택)  (0) 2022.03.27

댓글