문제
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() 함수를 잔뜩 걸고 확인해보는 방법도 있겠지만
그렇게 푸는게 무슨 효과가 있겠나 싶어서 제이그래머한테 조언을 구했다.
응, 혼났다!
결국 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로 생각하고 이용하면 될듯!
댓글남기기