Baekjoon 문제 풀기 (1966번 : 프린터 큐) Python

1966번 : 프린터 큐

1. 문제읽기


선입선출 구현하기

앞에서부터 데이터를 확인하여 중요도가 가장 높으면 출력하고, 중요도가 가장 높지 않으면 뒤로 보내는 방식이다.
중복된 값이 없는 케이스는 쉬웠는데, 중복된 값이 있는 케이스는 구별할 수 있는 방법이 생각나지 않아 문제를 풀지 못했다.
문제 분류는 큐(Queue)였는데, pop만 알면 풀 수 있는 문제였던 것 같다.

2. 제출 코드


큐의 개념을 몰라서 못풀었다기 보다는 같은 값인 것을 어떻게 target으로 잡고 구분하느냐가 문제의 포인트였던 것 같다.
pop으로 문제 푼지 얼마 안됐는데 고새 까먹고 remove를 쓰는 꼬라지…
아래와 같이 풀었는데, 테스트케이스 2번까지는 무난했지만, 3번에서 1을 구분할 수 없게 되면서 계속 답이 6이 나왔다.

t = int(input())

for _ in range(t):  # 테스트 케이스 수 만큼 반복
    n, m = map(int, input().split())
    arr = list(map(int, input().split()))
    total = 0
    target = arr[m]
    while target in arr:
        p = arr[0]
        if p == max(arr):
            arr.remove(p)
            total += 1
        else:
            arr.remove(p)
            arr.append(p)
        print(arr)

    print(total)

3. 공부할 것


Queue의 특성으로 문제를 풀었다고 하기에는 문제에서 pop(0)만 이용하여 풀 수 있었다.
이 문제에서 Stack 문제를 풀 때와 달랐던 점은 pop 대신에 pop(0)을 썼다는 점이라고 할까…
어쨌든 내가 막혔던 1을 target으로 어떻게 볼 것인가는 index 리스트를 하나 더 만들어서 pop할 때 같이 pop해주고, 체크할 때 target index인지를 체크하면 된다.

참고로 pop은 리턴값이 있는 함수이므로, 아래와 같이 arr.append(arr.pop(0))으로 써주면 remove, append를 두 번 써주지 않아도 되는 간편함이 있다.

t = int(input())

for _ in range(t):
	n, m = map(int, input().split())
	arr = list(map(int, input().split()))
	index_arr = list(range(len(arr)))
	target = index_arr[m]
	count = 0
	while 1:
		if arr[0] == max(arr):
			count += 1
			if index_arr[0] == target:
				print(count)
				break
			else:
				arr.pop(0)
				index_arr.pop(0)
		else:
			arr.append(arr.pop(0))
			index_arr.append(index_arr.pop(0))

댓글남기기