문제
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
알고리즘
- 뽑아 내려고하는 수를 모두 뽑을 때까지 반복한다.
- 현재 뽑아야하는 수가 큐의 앞쪽에서 뽑는게 더 가까운지 뒤쪽에서 뽑는게 더 가까운지 비교하여 수행한다.
- 앞쪽에서 뽑는게 더 가깝다면 2번 연산을 수행하면서 뽑아야하는 원소의 위치를 찾는다.
- 반대로 뒤쪽에서 뽑는게 더 가깝다면 3번 연산을 수행하면서 뽑아야하는 원소의 위치를 찾는다.
- 연산을 할때마다 카운트 해주고 뽑아야하는 원소를 다 뽑았다면 카운트 한 것을 출력한다.
코드
import sys
n, m = map(int, sys.stdin.readline().split())
queue = [i for i in range(1, n + 1)]
loc = list(map(int, sys.stdin.readline().split()))
cnt = 0
# 뽑아 내려고하는 수를 모두 뽑을 때까지 반복한다.
while loc:
# 현재 뽑아야하는 수가 큐의 앞쪽에서 뽑는게 더 가까운지 뒤쪽에서 뽑는게 가까운지 비교
# 앞쪽에서 뽑는게 더 깝다면
if queue.index(loc[0]) < len(queue) - queue.index(loc[0]):
# 앞쪽에서 뽑는게 더 가까운 경우 2번 연산을 수행하면서 뽑아야하는 원소의 위치를 찾는다.
while True:
# 현재 뽑을 수 있는 수가 뽑아야하는 수라면
if queue[0] == loc[0]:
del queue[0] # 큐에서 현재 원소를 제거
del loc[0] # 뽑아야하는 원소 리스트에서도 뽑아야 하는 원소를 제거
break
# 2번 연산 수행
else:
queue.append(queue[0])
del queue[0]
cnt += 1
# 뒤쪽에서 뽑는게 더 깝다면
else:
# 뒤쪽에서 뽑는게 더 가까운 경우 3번 연산을 수행하면서 뽑아야하는 원소의 위치를 찾는다.
while True:
# 현재 뽑을 수 있는 수가 뽑아야하는 수라면
if queue[0] == loc[0]:
del queue[0] # 큐에서 현재 원소를 제거
del loc[0] # 뽑아야하는 원소 리스트에서도 뽑아야 하는 원소를 제거
break
# 3번 연산 수행
else:
queue.insert(0, queue[-1])
del queue[-1]
cnt += 1
print(cnt)
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 18258번(파이썬): 큐 2 (0) | 2021.09.27 |
---|---|
[baekjoon] 백준 1717번(파이썬): 집합의 표현 (0) | 2021.09.26 |
[baekjoon] 백준 1764번(파이썬): 듣보잡 (0) | 2021.09.24 |
[baekjoon] 백준 3190번(파이썬): 뱀 (2) | 2021.09.23 |
[baekjoon] 백준 4949번(파이썬): 균형잡힌 세상 (0) | 2021.09.22 |