CodingTest/Baekjoon

[baekjoon] 백준 1021번(파이썬): 회전하는 큐

JunJangE 2021. 9. 25. 12:39

문제

 

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