문제

https://programmers.co.kr/learn/courses/30/lessons/42587?language=python3

풀이

def solution(priorities, location):
    op = priorities[location]
    lst = sorted(list(enumerate(priorities)), key=lambda x: x[1])
    
    cnt = 1
    while lst :
        i, p = lst.pop()
        if i == location and p == op :
            continue
        elif p < op :
            return cnt
        else :
            if p > op :
                cnt += 1
                bi = i
            elif i > bi :
                cnt += 1
        
    return cnt

최초로 접근했던 풀이 방법이다.
오름차순으로 정렬한 이유는, pop(0)이 한 칸씩 당겨오는 오버헤드가 크다고 해서
pop() 으로 해결할 수 있도록 오름차순 정렬로 접근해보았다.

lst에서 가장 큰 priority를 뽑아냈을 때
그 값이 출력해야하는 priority였다면 지나가고
출력해야하는 priority 보다 작다면 이후 모두 무의미 하므로
바로 출력순서를 반환한다.

만일 더 컸을 경우
출력순서를 증가시키고, bi라는 변수에
큰 priority의 index 값을 저장해둔다.
추후 priority가 출력해야하는 프린트물과는 같지만 index는 다른 값을 마주하는데,
이 index가 bi 변수에 저장된 index보다 더 클 경우
출력순서를 증가시키도록 했다.

테스트 1 〉	실패 (0.05ms, 10.2MB)
테스트 2 〉	통과 (0.06ms, 10.2MB)
테스트 3 〉	실패 (0.04ms, 10.2MB)
테스트 4 〉	실패 (0.02ms, 10.2MB)
테스트 5 〉	통과 (0.01ms, 10.2MB)
테스트 6 〉	실패 (0.02ms, 10.2MB)
테스트 7 〉	실패 (0.02ms, 10.1MB)
테스트 8 〉	실패 (0.05ms, 10.2MB)
테스트 9 〉	통과 (0.01ms, 10.3MB)
테스트 10 〉    실패 (0.02ms, 10.2MB)
테스트 11 〉	실패 (0.04ms, 10.3MB)
테스트 12 〉	실패 (0.02ms, 10.2MB)
테스트 13 〉	통과 (0.04ms, 10.1MB)
테스트 14 〉	통과 (0.01ms, 10.2MB)
테스트 15 〉	실패 (0.01ms, 10.2MB)
테스트 16 〉	통과 (0.02ms, 10.3MB)
테스트 17 〉	실패 (0.04ms, 10.2MB)
테스트 18 〉	통과 (0.01ms, 10.2MB)
테스트 19 〉	실패 (0.05ms, 10.2MB)
테스트 20 〉	실패 (0.03ms, 10.3MB)

틀려도 한참 틀렸다.
직접 print() 함수를 잔뜩 걸고 확인해보는 방법도 있겠지만
그렇게 푸는게 무슨 효과가 있겠나 싶어서 제이그래머한테 조언을 구했다.
image 응, 혼났다!
결국 1시간을 더 생각해봐도 방법이 안떠올라
제이그래머의 풀이를 참고했다.

def solution(priorities, location):
    rpriorities = sorted(priorities, reverse=True)
    cnt = 1
    while True :
        if priorities[0] == rpriorities[0] :
            if location == 0 :
                return cnt
            priorities.pop(0)
            rpriorities.pop(0)
            location -= 1
            cnt += 1
        
        else :
            priorities.append(priorities.pop(0))
            if location == 0 :
                location = len(priorities) - 1
            else :
                location -= 1
        
    return cnt

priority를 내림차순으로 정렬한 Queue를 하나 추가하고
기존 priority리스트를 Deque처럼 사용해서 풀어낸 풀이.
location 변수를 iterator처럼 사용한게 인상적이다.

이 집 잘하네.

더 나은 풀이

def solution(p, l):
    ans = 0
    m = max(p)
    while True:
        v = p.pop(0)
        if m == v:
            ans += 1
            if l == 0:
                break
            else:
                l -= 1
            m = max(p)
        else:
            p.append(v)
            if l == 0:
                l = len(p)-1
            else:
                l -= 1
    return ans

가장 많은 사람들이 풀어낸 풀이. 제이그래머가 풀어낸 것과 동일하다.
댓글에도 Deque을 사용해서 풀면 시간이 더 줄어든다고 한다.
근데 나를 포함한 대부분은 Deque를 import하는 것보다 pop(0)을 선호하는듯
import를 거리끼지 않고 할 줄 알아야 할 것 같다.

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의 a도 떠올리지 못했던 것 같다…

내친김에 any와 all에 대해 알아봤다.

any([False, False, False]) --> False
any([True, False, True])   --> True

all([True, True, True])    --> True
all([True, True, False])   --> False

any는 or, all은 and로 생각하고 이용하면 될듯!

댓글남기기