해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://school.programmers.co.kr/learn/courses/30/lessons/42587
위에 프로그래머스 링크를 통해 확인해주세용 ㅎㅎ
이 문제는 파이썬의 deque
라이브러리를 사용해서 해결했다. PriorityQueue 라이브러리를 사용해야하나 했었는데 deque를 사용해서 해결하는게 훨씬 효율적이고 간단할 거 같아서 deque를 선택했다.
먼저 내가 작성한 코드를 올려보자면!
"""
프로그래머스 LV2: 프로세스
https://school.programmers.co.kr/learn/courses/30/lessons/42587
"""
from collections import deque
def solution(priorities, location):
temp = [(i, priorities[i]) for i in range(len(priorities))]
queue = deque(temp) # queue로 선언
answer = 0
while queue:
data = queue.popleft() # queue에서 data를 꺼냄
bigCheck = False
for i in range(len(queue)):
if data[1] < queue[i][1]: # pop 했을 때 우선순위가 더 높은게 있다면
bigCheck = True
queue.append(data) # 다시 queue에 insert
break
if bigCheck == False: # 우선순위가 더 큰 프로세스가 없다면 꺼낸 프로세스 실행
answer += 1
if data[0] == location: # 찾는 location과 일치하는 경우 반복문 탈출 + 횟수 return
break
return answer
priorities = [2, 1, 3, 2]
print(solution(priorities, 2))
생각보다 잘 풀어서 놀랐다...? (죄송합니다 하하)
하지만 별표를 많이받은 분의 풀이를 보니 겸손해졌습니다.
def solution(priorities, location):
queue = [(i,p) for i,p in enumerate(priorities)]
answer = 0
while True:
cur = queue.pop(0)
if any(cur[1] < q[1] for q in queue):
queue.append(cur)
else:
answer += 1
if cur[0] == location:
return answer
priorities = [2, 1, 3, 2]
print(solution(priorities, 2))
- enumerate를 사용해서 index까지 받아버리기
- python의 any문법?
enumerate 부분은 저번 포스팅에서도 정리했던거 같은데 기억해내지 못하고 저렇게 풀어버렸다.. 아쉽다!
그리고 any라는 메서드는 들어보긴 했는데 사용해야겠다는 생각을 전혀 못했다.
any 메서드를 사용하니까 코드가 훨씬 간결해진걸 확인할 수 있었다. 유용하게 잘쓰일듯!
참고) 파이썬의 any?
any 함수는 인자로 받은 요소 중 하나라도 True가 있으면 True를 리턴하고 모든 요소가 거짓일 경우에만 False를 리턴해주는 함수.
나는 deque를 사용해서 해결을 했는데 별표 많이 받으신 분의 풀이를 보니 deque를 사용하지 않으시고 그냥 list를 사용해서 해결하셨당.
그래서 풀이를 보면서 deque랑 list의 효율성/속도 차이 그리고 다른 특징이 있나 궁금해서 찾아봤다.
결론만 정리해보자면..
사실 둘다 사용상에는 큰차이는 없지만 어떤 상황에서 어떻게 사용하냐에 따라 속도 차이가 발생한다.
실제로 1000개의 요소를 삭제하는데 list는 4.8초가 걸렸지만 deque는 0초에 가까운 시간이 발생했다고 한다.
따라서 삽입 또는 삭제가 앞/뒤/중간 등에서 발생하면 list보다는 deque 사용을 우선적으로 고려하는 것이 속도측면에서는 좋을 듯 하다!
자세한 설명은 추천 블로그에서 확인!