[프로그래머스-LV2] 프로세스 해설

아이엠강욱·2023년 5월 11일
0

코딩테스트

목록 보기
7/23

해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://school.programmers.co.kr/learn/courses/30/lessons/42587


1. 문제설명 (생략)

위에 프로그래머스 링크를 통해 확인해주세용 ㅎㅎ

2. 해결했지만 꿀팁들 정리하기!

이 문제는 파이썬의 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))
  1. enumerate를 사용해서 index까지 받아버리기
  2. python의 any문법?

enumerate 부분은 저번 포스팅에서도 정리했던거 같은데 기억해내지 못하고 저렇게 풀어버렸다.. 아쉽다!
그리고 any라는 메서드는 들어보긴 했는데 사용해야겠다는 생각을 전혀 못했다.
any 메서드를 사용하니까 코드가 훨씬 간결해진걸 확인할 수 있었다. 유용하게 잘쓰일듯!

참고) 파이썬의 any?
any 함수는 인자로 받은 요소 중 하나라도 True가 있으면 True를 리턴하고 모든 요소가 거짓일 경우에만 False를 리턴해주는 함수.

3. 추가적인 궁금증

나는 deque를 사용해서 해결을 했는데 별표 많이 받으신 분의 풀이를 보니 deque를 사용하지 않으시고 그냥 list를 사용해서 해결하셨당.

그래서 풀이를 보면서 deque랑 list의 효율성/속도 차이 그리고 다른 특징이 있나 궁금해서 찾아봤다.
결론만 정리해보자면..

사실 둘다 사용상에는 큰차이는 없지만 어떤 상황에서 어떻게 사용하냐에 따라 속도 차이가 발생한다.
실제로 1000개의 요소를 삭제하는데 list는 4.8초가 걸렸지만 deque는 0초에 가까운 시간이 발생했다고 한다.
따라서 삽입 또는 삭제가 앞/뒤/중간 등에서 발생하면 list보다는 deque 사용을 우선적으로 고려하는 것이 속도측면에서는 좋을 듯 하다!

자세한 설명은 추천 블로그에서 확인!


Reference

profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글