파이썬 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
'PS > BOJ&Programmers' 카테고리의 다른 글
[백준/6236] 용돈 관리 | 이진 탐색 트리 | 분할 | 파이썬 (0) | 2023.02.14 |
---|---|
[백준/5430] AC | deque의 reverse() | reverse를 여러 번? (0) | 2023.02.13 |
[백준/15821] 낚이고 낚아라 | 배열 2칸씩 묶기 _ range()의 활용 (2) | 2023.02.05 |
[백준/10819] 차이를 최대로 | 모든 순서를 고려한 배열.. permutation | 리스트 갱신법이 항상 효율적일까? (2) | 2023.01.31 |
[백준/3029] 경고 | 파이썬 (0) | 2023.01.29 |