알고리즘/프로그래머스문제풀이

[python][프로그래머스]프린터_스택/큐

개발자 덕구🐾 2022. 6. 9. 22:20
728x90

 

 

 

 

 

 

이 문제는 이해하기 쉬운 문제이다. 

어디서 많이 본 문제인데 혼자 못풀었다...

 

 

 

 

 

문제에 주어진 순서의 숫자가 언제 출력된가를 return하는 문제다. 

주어진 순서를 어떻게 기억할 수 있을까 고민했는데 

enumerate를 이용해 쌍으로 만드는 방법이었다. 

 

 

이 코드가 참 파이써닉하다.

내가 스스로 만들어낼수있도록 친숙해지고싶다.

 

이 코드는 사실

d = deque 

for i, v in enumerate(priorities) : 

    d.append([v,i])

 

와 같이 3줄로 만들 수 있다. 

하지만 

 

d = deque ( [ ( v,i ) for i,v in enumerate(priorities) ] )

 

이렇게 한줄로 만들 수 있다. 

 

 

 

 

 

 

 

코드 : 

 

def solution(priorities, location):
    answer = 0
    from collections import deque
    d = deque([(v,i) for i,v in enumerate(priorities)])

    while len(d):
        item = d.popleft()
        if d and max(d)[0] > item[0]: # d가 있어야하는 이유는? 
            """
            item은 d에서 pop으로 원소를 빼버린다. 즉 마지막에는 d에 아무것도 없다.
            이때 max(d)를 호출하면 arg가 없는데 max 사용한다고 에러가 난다.
            그래서 d를 써서 애초에 d가 없으면 max(d)가 호출이 안되므로 에러가 나는 것을 막을 수 있다. 
            추가로 d가 없는 경우는 마지막 원소일 경우니까 이때는 else로 가도록 만들 수 있다.
            """
            d.append(item)
        else: 
            answer += 1
            if item[1] == location:
                break
    return answer

 

* break 대신 return answer해도 된다. 

 

 

if d and max(d)[0] > item[0] : 에서 d가 있어야하는 이유 !

 

1. max()에서 에러가 발생하는 것을 방지

 

2. d가 비었을 때 else 로 인도하기 위해서 

 

 


 

 

 

 

 

배운점 : 

 

1. deque 을 import하는 방법 

[사실 덱으로 안풀고 리스트로 풀어도 성공은 한다. 속도 차이도 별로 못느꼈지만 차이가 조금 있겠지] 

 

[차이가 있다.] 

https://wellsw.tistory.com/122

 

[파이썬] 덱 vs 리스트 속도 차이? (deque vs list speed 차이)

덱과 리스트? 여러분은 어떤 차이를 두고 두 자료구조를 적절하게 사용하시나요? 둘 다 사용상에는 큰 차이가 없어 보입니다. 그렇지만, 이 자료구조를 어떤 상황에서 어떻게 사용하느냐에 따라

wellsw.tistory.com

 

 

 

2. max(d)[0] 이라는 신박함 (내 기준) 

첫번째 원소로 비교하기때문에 deque를 만들 때 v,i 순서로 한것일거이다. 

 

 

 

[복습 중 알게된 점]

3. if else 만 단순히 바꿨다고 생각했는데 틀림

 

 

< 몇개가 시간초과> 

from collections import deque

def solution(priorities, location):
    answer = 0
    d = deque([v,i] for i,v in enumerate(priorities))
    while d :
        tmp = d.popleft()
        if d and tmp[0] >= max(d)[0] :
            answer+=1 
            if tmp[1] == location :
                return answer
        else :
            d.append(tmp)

 

복습을 하면서 다음과 같이 if문을 출력을 하도록 만들었다. 

이때 시간초과가 발생하였다.

 

 

이유는 덱에 하나의 원소만 남을 겨우

마지막 원소를 tmp로 하여 코드를 진행할 때 d에 아무것도 없기때문에  

if d and tmp[0] >= max(d)[0] : 안에 들어가 location인지 비교할 수 없다. 

 

 

결국 else로 가게되고 else는 다시 d에 append를 한다. 

즉 무한 반복문이 되어 시간초과가 발생하는 것이다. 

 

 

그래서 마지막 원소를 뺄 경우를 예외처리 해주면  다음과 같다. 

 

< 정답 코드 >

from collections import deque

def solution(priorities, location):
    answer = 0
    d = deque([v,i] for i,v in enumerate(priorities)) 
    while d :
        tmp = d.popleft()
        if len(d) == 0 : # 마지막까지 location을 못찾은 상태라면 
            return answer+1  # 이게 그냥 답 
        if tmp[0] >= max(d)[0] :
            answer +=1 
            if tmp[1] == location :
                return answer
        else :
            d.append(tmp)

 

 

 

 

깊게 생각하자. 

 

 

 

사실 틀린 이유를 모르겠어서 알고리즘 카톡방에 물어봤다.

정말 똑똑한 사람들...너무 감사하다. 

 

 

 

참고 블로그 : 

 

 

https://eda-ai-lab.tistory.com/461

 

[프로그래머스] 프린터 / 파이썬

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

eda-ai-lab.tistory.com

 

 

복습 : 

 

✅ 20220620

20220622

✅ 20220626

✅ 20220627

✅ 20220630

✅ 20220701

반응형