이 문제는 이해하기 쉬운 문제이다.
어디서 많이 본 문제인데 혼자 못풀었다...
문제에 주어진 순서의 숫자가 언제 출력된가를 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
'알고리즘 > 프로그래머스문제풀이' 카테고리의 다른 글
[PYTHON][프로그래머스]디스크 컨트롤러_힙 (0) | 2022.06.11 |
---|---|
[python][프로그래머스]더 맵게_힙(heap) (0) | 2022.06.10 |
[python][프로그래머스]주식가격_스택/큐 (0) | 2022.06.10 |
[python][프로그래머스] 다리를 지나는 트럭_스택/큐 (0) | 2022.06.10 |
[python][프로그래머스]기능개발_[스택/큐] (0) | 2022.06.09 |