혼돈의 효율성 : 프린터

solee·2022년 9월 7일
0

Python

목록 보기
14/16

https://school.programmers.co.kr/learn/courses/30/lessons/42587

(대기목록의 가장 마지막에 넣습니다)

스택/큐에 대한 문제인데, 그 부분을 크게 활용하지는 못해서 아쉬웠다.
일단 문제를 파악해 보니 대기 목록을 루프 돌려서 파악해 봐야겠다 싶었다.

file_list라는 배열에 이차원 배열로 만들어서 각각의 인덱스만큼의 중요도를 가진 문서들을 저장한 후 해당 문서들을 현재 위치standard_idx를 기준으로 삼아 더 크면 answer에 삽입시켰다.

def solution(priorities, location):
    answer = []
    file_list  = [[]]*10
    prior_list = [ (i,v) for i, v in enumerate(priorities)]

    for i in range(1, 10):
        if i in priorities:
            file_list[i] = list(filter(lambda x : x[1]==i, prior_list))

    standard_idx = -1
    tmp = []

    for i in range(9, 0, -1): 
        if file_list[i]:
            for index, value in file_list[i]:
                if index > standard_idx:
                    answer.append(index)
                    standard_idx = index
                else:
                    tmp.append(index)
                    continue

            for m in tmp:
                answer.append(m)
                standard_idx = m
            else:
                tmp = []

    return answer.index(location)+1

먼저 [[ ],[ ],[ ],[ ],[ ], ... [ ]] 모양의 리스트를 만든 후, enumerate()를 사용해 index와 해당 파일의 중요도에 따라 for문을 돌려 해당 리스트의 인덱스=중요도로 저장하도록 들어가도록 했다.

현재 파일의 위치를 의미하는 standard_idx는 -1로 기본값을 잡아 두고 tmp는 현재 위치보다 작은 경우 추후에 추가해주기 위해 임시로 저장한다.




메인 코드는 이 부분인데, 각 중요도 기준으로 파일이 저장된 file_list[i]에서 index를 검증한 후 answer에 append()한다. 현재 위치보다 크다면 다음 출력 순서기 때문이며 그 후에는 standard_idx에 지금 출력한 파일의 위치, 즉 index를 할당한다.
반대로 현재 위치보다 작다면, 즉 다음 출력 순서가 아니라 쭉 한바퀴 돌아와서 삽입되어야 하므로 tmp에 append()한다.

    for i in range(9, 0, -1): 
        if file_list[i]:
            for index, value in file_list[i]:
                if index > standard_idx:
                    answer.append(index)
                    standard_idx = index
                else:
                    tmp.append(index)
                    continue

            for m in tmp:
                answer.append(m)
                standard_idx = m
            else:
                tmp = []

예를 들어 i가 4, 즉 중요도가 5인 파일의 인덱스인 [1, 3, 6, 7]이 저장되어 있고 standard_idx가 4라면 4 다음에 나오는 6, 7을 바로 answer에 삽입하고 1, 3은 tmp에 삽입해 둔 후 i=2인 loop 마지막에 tmp를 answer에 삽입하는 것이다. 그리고 마지막으로 standard_idx를 삽입한 tmp의 값으로 할당해 현재 위치를 재조정한 후 중요도 4로 넘어가 같은 행동을 반복한다.




한참 붙잡고 있다가 겨우 풀어내서 스스로의 끈기를 조금 칭찬했다(ㅎㅎ)

아쉬운 점!

먼저 location(출력 순서를 알고 싶은 파일의 인덱스)가 나오면 그 자리에서 바로 return시키고 싶었지만 막상 돌려 보니 자꾸 오류가 나서 일단은 포기했다. 한번 다른 문제 풀다가 생각나면 돌아와서 만져 볼 예정이다.

또 다른 사람들의 풀이 코드를 보고는 파이써닉하게, 간결하게 작성하지 못한 게 너무 아쉬웠지만, 돌려 보면 효율성은 괜찮아서(0.2ms를 넘는 것이 없다) 살짝 위안을 얻었다.
스택이나 큐를 사용하는 것이 아무래도 더 복잡하기 때문인 듯하다.

스윗~

profile
DA DA DA

0개의 댓글