https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
from collections import deque
def solution(priorities, location):
temp = [(p, i) for i, p in enumerate(priorities)]
temp = my_sort(temp)
for i in range(len(temp)):
if location == temp[i][1]:
return i+1
def my_sort(temp):
q =deque(temp)
result = []
while q:
j, index = q.popleft()
for i in range(0, len(q)):
if q[i][0] > j:
q.append((j, index))
break
else:
result.append((j, index))
return result
먼저 저는 list comprehension
을 사용하여 temp
에 (우선순위, 인덱스)형태로 값을 저장하였습니다.
my_sort
함수를 작성하여 문제에서 요구한 인쇄순서로 정렬하였습니다.
my_sort
함수에서는 리스트의 맨 앞을 쉽게 추출하기 위하여 collections
의 deque
를 사용하였습니다.while
문을 통하여 q
가 빌때까지 반복하는데 j, index
로 q
의 가장 첫번째 요소를 추출하고
나머지 q
에 j
보다 큰 값이 있는지, 즉 중요도가 높은 값(문서)이 있는지 확인합니다.
만약 중요도가 높은 값(문서)이 존재한다면 현재 문서 j
와 index
를 q.append()
를 하여 q
의 가장 마지막 부분으로 옮겨 저장합니다.
그리고 break
문으로 for
문을 빠져나옵니다.
break
에 걸리지 않고 for
문을 다 돌았다면 else
문에서 result
에 j
와 index
를 저장합니다.
이렇게 정렬된 temp
를 반복하면서 location
과 temp[i][1]
이 동일하다면 i+1
을 하여 결과를 반환합니다.
다음은 위의 코드를 약간 수정하여 문제를 해결한 코드입니다.
다른 사람의 풀이에서 좋은 코드가 있어서 참고하였습니다.
from collections import deque
def solution(priorities, location):
temp = [(p, i) for i, p in enumerate(priorities)]
temp = my_sort(temp)
for i in range(len(temp)):
if location == temp[i][1]:
return i+1
def my_sort(temp):
q =deque(temp)
result = []
while q:
j, index = q.popleft()
if any(j < value[0] for value in q):
q.append((j, index))
else:
result.append((j, index))
return result
위의 코드와 많이 유사하지만 중요도가 높은 문서를 찾는 과정에서 any
와 for
키워드를 사용하여 2줄로 줄여 문제를 해결한 것을 확인할 수 있습니다.
시간복잡도는 $O(n^{2})$으로 비슷한것 같지만 가독성은 더 좋아진 것 같습니다!
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 자동차 대여 기록에서 장기/단기 대여 구분하기 MySQL (1) | 2023.01.21 |
---|---|
[코딩테스트] 프로그래머스 평균 일일 대여 요금 구하기 MySQL (0) | 2023.01.20 |
[코딩테스트] 프로그래머스 괄호 회전하기 파이썬(Python) (1) | 2023.01.18 |
[코딩테스트] 백준 수 찾기 파이썬(Python) (0) | 2023.01.17 |
[코딩테스트] 백준 부분수열의 합 파이썬(Python) (0) | 2023.01.14 |