[백준] 1966번 : 프린터 큐

letsbebrave·2022년 1월 19일
0

codingtest

목록 보기
25/146

문제

어려웠던 부분

테스트케이스

6 0
1 1 9 1 1 1

5

맨 앞의 데이터가 가장 큰 수가 아니면 맨 뒤로 가야 하는 정렬이므로, M=0에 해당되는 1은 다섯번째로 출력되어야 한다. 이 문제에서 어려웠던 부분은 위의 테스트케이스를 만족하도록 하는 것이었다.

https://assaeunji.github.io/python/2020-05-04-bj1966/

이 분의 블로그를 보고, 원래 문서의 인덱스를 idx라는 배열에 저장해놓고 기존 list의 순서가 바뀔 때마다 같이 순서를 바꿔주면 된다는 것을 알아냈다.
그리고 무한반복의 종료 조건은 idx 배열에서 첫번째 값이 target (우리가 찾고자 했던 것)이고 기존 list에서 맨 앞의 값이 최대값일 때 순서를 출력해주고 break를 해주면 된다.

개념

리스트 = list(range(횟수))

idx = list(range(len(n)))
리스트 n의 크기만큼 0부터 크기-1까지의 원소를 가지는 리스트 idx를 만들어준다.
즉, idx는 n의 인덱스 값을 원소로 가지는 리스트라고 할 수 있다.

>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

풀이

import sys

t = int(sys.stdin.readline())

for i in range(t):
    N, M = map(int, input().split())
    
    n = list(map(int, input().split()))
    idx = list(range(len(n)))
    idx[M] = 'target'
    
    if N == 0 :
        print(1)
    else :
        count = 0
        while True :
            if n[0] < max(n):
                n.append(n[0])
                n.pop(0)
                idx.append(idx[0])
                idx.pop(0)
            else:
                if idx[0] == 'target' and n[0] == max(n) :
                    count += 1
                    print(count)
                    break
                else :
                    n.pop(0)
                    count += 1
                    idx.pop(0)
        

profile
그게, 할 수 있다고 믿어야 해

0개의 댓글