최초의 풀이.

from collections import deque, Counter

def solution(priorities, location):
  	traget = (prioritieis[location], location)
    nums = set(priorities)
    table = Counter(priorities)
    queue = deque([(priority, loc) for loc, priority in enumerate(priorities)])
    cnt = 1
    
    while True :
        if queue[0][0] == max(nums) and queue[0] != target:
            printed = queue.popleft()[0]
            cnt += 1
            table[printed] -= 1
            if table[printed] == 0:
                nums.remove(printed)

        elif queue[0][0] == max(nums) and queue[0] == target:
            return cnt

        else :
             queue.append(queue.popleft())

스택/큐 알고리즘을 공부한 직후에 풀었더니, 생각을 깊이 하지 않고 기계적으로 푼 것 같은 느낌이 들었다.
비효율적인 부분이 여럿 있다.

  • 우선 queue[0]은 어느 상황에서든 pop을 해야하기 때문에 , popleft 이후 if로 나뉘어지는 상황에 대응하면 되는 것이었다.
  • if와 elif 부분은 공통 요소가 있으므로 하나로 묶어, 가독성을 높일 수 있었다.
  • target을 정의한 부분은 부끄러울 정도다. 왜 저런 짓을 했는지를 모르겠다.... location은 고유 값이기 때문에 location만 비교해주어도 원하는 결과를 낼 수 있었다.

아래는 다른 사람의 풀이를 참고하여 수정을 가한 코드.

from collections import deque, Counter

def solution(priorities, location):
  
    nums = set(priorities)
    table = Counter(priorities)
    queue = deque([(priority, loc) for loc, priority in enumerate(priorities)])
    cnt = 1
    
    while True :
        
        cur = queue.popleft() #우선 첫 번째 요소를 뽑아내었다.
            
        if cur[0] == max(nums) :
                
            if cur[1] != location:
                cnt += 1
                table[cur[0]] -= 1

                if table[cur[0]] == 0:
                    nums.remove(cur[0])
                
            else : # 분기를 나누었다.
                return cnt
            
        else : 
            queue.append(cur)
                    

참고 할 만한 다른 사람의 풀이


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

any 부분을 기억하고 싶어서 갖고 왔다.
아마 연산 속도에서는 내가 짠 코드가 더 빠를 것으로 예상되나 (확실하진 않다😅)
any를 쓰니 너~무 코드가 이뻐서 기억하고 싶다.

0개의 댓글