ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1021번 : 회전하는 큐 (Python, 파이썬)
    카테고리 없음 2019. 2. 4. 00:01

    https://www.acmicpc.net/problem/1021


    큐를 움직일 함수를 먼저 정의한다. 포인터를 어디로 이동할지 결정하기 전에 예비로 포인터를 인덱스 0에 두고 뽑아내려는 수와 인덱스0의 수가 같아질 때까지 포인터를 오른쪽 이동해본다.

    수가 같아지면 right에 담긴 숫자를 확인해 얼만큼 오른쪽으로 이동했는지 확인한다. 

    그리고 큐의 전체 길이에서 오른쪽으로 이동한 횟수를 뺴 왼쪽으로 이동해야할 횟수를 구한다. 

    그리고 오른쪽으로 이동한 횟수, 왼쪽으로 이동한 횟수를 비교해 이동횟수가 적은 방향을 선택해 실제로 포인터를 이동한다.

    정의한 함수는 이동 후 포인터가 큐에 위치한 인덱스, 이동횟수를 반환한다


    for문을 활용해 뽑아내려고하는 수를 차례로 함수에 넣는다. 

    for문이 돌때마다 함수가 반환한 포인터 위치를 활용해 큐를 새롭게 조정한다.

    그리고 이동횟수를 누적한다.

    그 후 누적된 이동횟수를 출력하면 최솟값을 출력하게 된다. 


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    def move(p, num):
        right = 0
        left = 0
        while True:
            if Deque[p] == num:
                left = len(Deque) - right
                break
            else:
                right += 1
                p += 1
        if right < left:
            if len(Deque) == 0:
                return 0, right
            return p, right 
        else:
            if len(Deque) == 0:
                return 0, left
            return p, left
     
     
    N, M = list(map(int,input().split(' ')))
    Deque = [i for i in range(1,N+1)]
    pick_num = list(map(int,input().split(' ')))
    count = 0
    for j in pick_num:
        Aft_Pointer, Aft_Count = move(0, j)
        temp = Deque[:Aft_Pointer]
        Deque = Deque[Aft_Pointer+1:] + temp
        count = count + Aft_Count
    print(count)
    cs


Designed by Tistory.