반응형
백준 1021번 회전하는 큐 문제입니다.
처음에 문제 이해하기가 약간 까다로웠다.
설명에는 큐의 원소 갯수 n과 위치가 나온다고 설명이 되어있지만 입출력을 보면 둘째줄의 숫자들이 위치를 나타내는 숫자들이다.
입력의 첫째줄은 큐의 크기, 뽑아내려 하는 요소 갯수 이고 둘째줄은 요소의 초기 위치이다.
세가지 연산이 주어진다.
1번은 맨 첫번째 요소를 뽑아내는 연산
2번은 왼쪽으로 하나씩 밀고 첫번째는 맨뒤로 보내는 연산
3번은 오른쪽으로 하나씩 밀고 맨 뒤의 요소를 맨 처음으로 보내는 연산
출력 값은 사용되는 2, 3번 연산의 최소 횟수이다.
원하는 요소를 뽑아낼때 왼쪽으로 밀어낼지 오른쪽으로 밀어낼지를 결정하고 최소로 만들어야 할것이다.
추가로 입력을 줄 때 굳이 뽑아내려 하는 요소 갯수가 필요했을까? 둘째줄에 위치와 함께 갯수가 나오는데 말이다...
암튼 작성한 코드는 다음과 같다.
import sys
size, n = map(int, sys.stdin.readline().split())
arr = list(map(int, sys.stdin.readline().split()))
for i in range(len(arr)):
arr[i] -= 1
count = 0
while True:
if len(arr) == 0:
break
if arr[0] == 0:
for i in range(len(arr)):
arr[i] -= 1
del arr[0]
size -= 1
elif size/2 < arr[0]:
count += (size - arr[0])
temp = arr[0]
for i in range(len(arr)):
arr[i] += (size - temp -1)
if arr[i] > size-1:
arr[i] -= size
del arr[0]
size -= 1
else:
count += arr[0]
temp = arr[0]
for i in range(len(arr)):
arr[i] = arr[i] - (temp+1)
if arr[i] < -1:
arr[i] = size + arr[i]
del arr[0]
size -= 1
print(count)
리뷰를 해보면 초기 배열이 어떻게 되어있는지는 신경쓰지 않았다.
처음 주어지는 요소의 위치만 가지고 로직이 돌아간다.
첫번째 뽑아낼 요소를 뽑아내게 되면 기존 요소의 위치가 어떻게 변하는지 바꿔가면서 진행시키게 된다.
중간에 구현이 잘 안되었는데 알고보니 for문을 통해 모든 요소의 위치를 변경시켜 주는데
arr[0]을 바꾸고 바꾼 arr[0]을 활용하면서 문제가 발생했다.
뽑아내면서 위치가 -1씩 줄어드는 점도 생각해주어야 한다.
성공!
반응형
'Computer Science > 백준' 카테고리의 다른 글
백준 18258번 큐2 (0) | 2021.08.17 |
---|---|
백준 2164번 카드2 (0) | 2021.08.17 |
백준 10866번 덱 (0) | 2021.08.12 |
백준 1966번 프린터 큐 (0) | 2021.08.11 |
백준 14889번 스타트와 링크 (0) | 2020.03.12 |