250x250
Notice
Recent Posts
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
관리 메뉴

일상 코딩

[python] 백준 알고리즘 1966번 프린터 큐, 튜플 사용없는 풀이 본문

코딩테스트/백준 online Judge

[python] 백준 알고리즘 1966번 프린터 큐, 튜플 사용없는 풀이

polarcompass 2021. 11. 6. 03:50
728x90

https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net

T = int(input())
for _ in range(T):
    N, M = map(int, input().split())
    q = list(map(int, input().split()))
    ck = [False]*N  # target 번호 추적 체크 리스트
    ck[M] = True  # target만 True로 변환
    cnt = 0
    target = q[M]
    idx_t = M

    def down_shift(idx):
        ck = [False] * len(q)
        idx -= 1
        ck[idx] = True
        return idx, ck

    def back_shift(idx):
        ck = [False] * len(q)
        idx = len(q) - 1
        ck[idx] = True
        return idx, ck

    while True:
        vip = max(q)
        if q[0] == vip:
            q.pop(0)
            cnt += 1
            if vip == target and ck[0]:
                print(cnt)
                break
            idx_t, ck = down_shift(idx_t)

        else:
            if q[0] == target and ck[0] and q[0] != vip:
                tmp = q.pop(0)
                q.append(tmp)
                idx_t, ck = back_shift(idx_t)

            else:
                temp = q.pop(0)
                q.append(temp)
                idx_t, ck = down_shift(idx_t)

입력 예제

3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1

출력 예제

1
2
5

튜플 없이 풀게 되면

상당히 어려워지게 된다.

특히나 테스트케이스 3번의 경우 ([1,1,9,1,1,1])

동일한 숫자들이 있어서 번호를 특정할 수가 없게된다.

이 경우 대부분 check 리스트를 사용하게되고, 

다이나믹 프로그래밍이라 부르는 알고리즘을 사용하게 된다.

q 리스트가 가변적으로 변하기에 함수를 각각 적용하여 풀게되면

튜플을 이용한것보다 비효율적이고, 시간도 많이 걸리게 된다.

가급적 튜플을 적용한 풀이법을 추천드린다.

728x90