본문 바로가기
Coding 문제 풀이

[1021번] 회전하는 큐 코딩

by 김수호님 2018. 12. 19.
728x90
반응형

문제


지민이는 N개의 원소를 포함하고 있는 양방향 순환 큐를 가지고 있다. 지민이는 이 큐에서 몇 개의 원소를 뽑아내려고 한다.

지민이는 이 큐에서 다음과 같은 3가지 연산을 수행할 수 있다.

  1. 첫 번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak와 같이 된다.
  2. 왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 a2, ..., ak, a1이 된다.
  3. 오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 ak, a1, ..., ak-1이 된다.

큐에 처음에 포함되어 있던 수 N이 주어진다. 그리고 지민이가 뽑아내려고 하는 원소의 위치가 주어진다. (이 위치는 가장 처음 큐에서의 위치이다.) 이때, 그 원소를 주어진 순서대로 뽑아내는데 드는 2번, 3번 연산의 최솟값을 출력하는 프로그램을 작성하시오.




코딩

import sys
M,N=sys.stdin.readline().split()

class Cir_Deque():
    def __init__(self,M,N):
        self.tmp=[x for x in range(1,M+1)]
        self.num=N
        self.ret=self.tmp.copy()
        self.cnt=0

    def left_move(self):
        self.tmp.append(self.tmp.pop(0))

    def right_move(self):
        self.tmp.insert(0,self.tmp.pop())

    def pop_value(self):
        self.tmp.pop(0)

    def check(self,msg):

        for x in msg:
            idx=self.ret.index(x)
            if (len(self.tmp)-idx)>idx:
                while self.tmp[0]!=x:
                    self.left_move()
                    self.cnt+=1
            else:
                while self.tmp[0]!=x:
                    self.right_move()
                    self.cnt+=1
            self.pop_value()
            self.ret=self.tmp.copy()
        print(self.cnt)
        
ret=list(map(int,sys.stdin.readline().split()))
a=Cir_Deque(int(M),int(N))
a.check(ret)


728x90
반응형

'Coding 문제 풀이' 카테고리의 다른 글

[2747번] 피보나치 코딩  (0) 2018.12.30
[5430번]AC 코딩  (3) 2018.12.19
[10866번]덱(deque) 코딩  (1) 2018.12.19
[11866번]조세퍼스 문제 코딩  (2) 2018.12.19
[1966번]프린터 큐 코딩  (1) 2018.12.19