Today I Learned/Python 문제풀이
[프로그래머스] lv2. 프린터
하나719
2020. 11. 16. 10:51
반응형
문제링크: programmers.co.kr/learn/courses/30/lessons/42587
코딩테스트 연습 - 프린터
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린
programmers.co.kr
아이디어
- 처음 주어진 우선순위 리스트를 index 정보와 함께 저장한다. (처음의 location 정보로 답변해야하므로) : (index,value)
- value 기준으로 max 값을 찾아서 슬라이싱을 활용해 리스트 정렬을 다시해준다.
- 해당 max값은 기존 리스트에서 pop해주고, 새로운 리스트에 쌓아준다.
- 기존 리스트가 0이 될때까지 반복한다.
Solution1. (틀림)
처음 리스트에서 max값 기준으로 한번만 정렬하고 찾아주는 줄 알았다.
for문 안쓰고 싶어서 +,- 로 계산했다.
1) max 값 index보다 앞쪽에 있으면, max값 뒤로 밀리니까 +
2) max 값 index보다 뒤쪽에 있으면, max값 기준으로 순서가 땅겨지니까 -
하지만 이렇게하면 재정렬은 안된다.
테스트 케이스는 모두 통과했지만, 정렬이 한번더 되어야하는 케이스는 통과하지 못했다.
def solution(priorities, location):
# max 값의 인덱스
index_p = priorities.index(max(priorities))
# location이 index_p보다 앞에 있으면 순서 밀림
if location < index_p:
return location + len(priorities[index_p:]) + 1
else:
return location - index_p + 1
Solution2.
- 우선 재정렬 할때마다 index 값이 달라지므로, 초기의 index값을 저장해놓기 위해서 (index, value)로 저장되는 리스트를 만들었다
- 2중 리스트에서 max값 찾기: max(list, key = (lambda x: x[1])) -> max 함수 안에서 key 파라미터에 X[1]을 넣어주어서 value 기준 max 값을 찾았다.
- max 인덱스부터 마지막까지 앞쪽으로 오고, 0번째 인덱스부터 max-1 인덱스를 뒤쪽으로 보내 재정렬 해주었다.
- 재정렬된 인덱스에서 첫번째 인덱스 (max) 를 Pop 해서 기존 인덱스에서 빼주면서, 새로운 리스트에 추가해주었다.
- 기존 리스트의 길이가 0이 될때까지 해당 작업을 반복해준다.
- 처음 리스트에서 찾기 원했던 작업을 새로운 리스트에서 위치를 반환해준다. (출력순서)
def solution(priorities, location):
# 변수 선언
new_list = []
i=[(i,p) for i,p in enumerate(priorities)]
find_value = i[location]
while len(i)>0:
i_max=i.index(max(i, key=(lambda x: x[1])))
i = i[i_max:] + i[:i_max]
new_list.append(i.pop(0))
return new_list.index(find_value) + 1
반응형