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를 넘는 것이 없다) 살짝 위안을 얻었다.
스택이나 큐를 사용하는 것이 아무래도 더 복잡하기 때문인 듯하다.
스윗~