파이썬 deque

deque는 문제풀이에서 종종 사용했었지만 주요 내용을 다시 한번 정리해보았다.

알고리즘

파이썬 deque 자료구조를 알고있다면 어렵지 않게 해결할 수 있다.

 

최종코드

from collections import deque
n,m = map(int, input().split())
que = deque(range(1,n+1))
idx = list(map(int, input().split()))
cnt = 0
for i in idx:
    # 다 찾을 때까지 수행
    while True:
        # 찾고자 하는 값의 위치가 중간보다 왼쪽인 경우
        if que.index(i) <= len(que)//2 :
            if i == que[0] : 
                que.popleft()
                break
            else:
                cnt += 1
                que.rotate(-1)
        else:
            if i == que[0]:
                que.pop()
                break
            else:
                cnt += 1
                que.rotate(1)    
print(cnt)

연산의 횟수를 세어야 하기 때문에 cnt 변수로 연산 횟수를 카운팅했다.

알게된 점

from collections import deque

n,m = map(int,input().split())
# deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 이런식으로 큐를 표현한다.
data = deque([i for i in range(1,n+1)])
#뽑아내려고 하는 수의 위치가 index변수에 순서대로 담아있다.
index = list(map(int,input().split()))

count = 0
for num in index:
    while 1:
        if data[0] == num:
            data.popleft()
            break
        else:
            if data.index(num) <= len(data)//2:
                data.rotate(-1)
                count += 1
            else:
                data.rotate(1)
                count += 1

print(count)

다른 분의 코드와 내 코드를 비교했을 때, if문의 사용이 좀 다르다.

일단 먼저 target값으면 pop해주고 찾지 못했을 때 회전을 하면서 count를 해주었다.

 

가장 큰 차이점은 문제의 본질을 가장 윗단 if문에 사용하신 거다..!

순차구조로 코드가 돌아갈 때 if문은 가장 윗 부분에 가장 중요한 조건을 쓰는 게 좋은 거라고 배웠다. 

그래야 clean code에 충실할 수 있고, 불필요한 if문 사용을 줄일 수 있기 때문이다.

내 코드도 기능 구현을 위해서 if문을 잘 사용하였지만 전체적인 코드 구성을 생각하며 코드를 짜면 더 좋은 코드가 될 것이다.

reference

https://jae-eun-ai.tistory.com/10

 

백준 1021번 : 회전하는 큐 (Python)

https://www.acmicpc.net/problem/1021 1021번: 회전하는 큐 첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째

jae-eun-ai.tistory.com

 

sebinChu