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

 

반응형