반응형
문제
지민이는 N개의 원소를 포함하고 있는 양방향 순환 큐를 가지고 있다. 지민이는 이 큐에서 몇 개의 원소를 뽑아내려고 한다.
지민이는 이 큐에서 다음과 같은 3가지 연산을 수행할 수 있다.
- 첫 번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak와 같이 된다.
- 왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 a2, ..., ak, a1이 된다.
- 오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 ak, a1, ..., ak-1이 된다.
큐에 처음에 포함되어 있던 수 N이 주어진다. 그리고 지민이가 뽑아내려고 하는 원소의 위치가 주어진다. (이 위치는 가장 처음 큐에서의 위치이다.) 이때, 그 원소를 주어진 순서대로 뽑아내는데 드는 2번, 3번 연산의 최솟값을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 순서대로 주어진다. 위치는 1보다 크거나 같고, N보다 작거나 같은 자연수이다.
해설
deque 클래스를 만들고, deque를 이용해서 문제를 풀었습니다.
기본적인 deque의 함수들은 백준의 기본 deque 문제가 제시하는 기준에 맞춰서 구현을 하였고, 제가 추가로 구현한 함수는 find함수로 특성 숫자가 몇번째 index에 있는지 알려주는 함수만 추가로 만들었습니다.
코드
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | class Deque(): def __init__(self, size): self.queue = [0 for x in range(size + 1)] self.front_flag = 0 self.rear = 0 self.max_size = size self.list_size = size + 1 def push_back(self, num): if (self.rear + 1) % self.list_size == self.front_flag: return -1 self.queue[self.rear] = num self.rear = (self.rear +1) % self.list_size def push_front(self, num): if (self.rear + 1) % self.list_size == self.front_flag: return -1 self.front_flag = self.list_size - 1 if self.front_flag == 0 else self.front_flag - 1 self.queue[self.front_flag] = num def pop_front(self): if self.size() == 0: return -1 temp = self.queue[self.front_flag] self.front_flag = (self.front_flag + 1) % self.list_size return temp def pop_back(self): if self.size() == 0: return -1 self.rear = self.list_size - 1 if self.rear == 0 else self.rear - 1 return self.queue[self.rear] def size(self): if self.front_flag == self.rear: return 0 elif self.rear > self.front_flag: return self.rear - self.front_flag else: return self.max_size - (self.front_flag - self.rear) + 1 def empty(self): return 1 if self.front_flag == self.rear else 0 def front(self): if self.size() == 0: return -1 return self.queue[self.front_flag] def back(self): if self.size() == 0: return -1 return self.queue[self.rear - 1] def find(self, num): index = 0 i = self.front_flag while(True): if self.queue[i] == num: return index index = index + 1 i = (i + 1) % self.list_size if i == self.rear: break n, m = map(int, input().split()) deque = Deque(n) temp = list(map(int, input().split())) for i in range(n): deque.push_back(i+1) #이동 회수를 저장하기 위한 변수 count = 0 for i in range(m): # 찾아야 되는 숫자의 현재 위치 index = deque.find(temp[i]) mid = (n - i) / 2 if index <= mid or (n-i) <= 2: #앞쪽임 while(deque.front() != temp[i]): deque.push_back(deque.pop_front()) count += 1 else: #뒤쪽임 while(deque.front() != temp[i]): deque.push_front(deque.pop_back()) count += 1 deque.pop_front() print(count) | cs |
반응형
'끄적 > Algorithm' 카테고리의 다른 글
[알고리즘] 백준 - 1003 피보나치 함수 파이썬 구현 (0) | 2019.01.18 |
---|---|
[알고리즘] 백준 - 5430 AC 파이썬 구현 (0) | 2019.01.17 |
[알고리즘] 백준 - 11866, 1158 조세퍼스 문제 파이썬 구현 (0) | 2019.01.13 |
[알고리즘] 백준 - 1966 프린터큐 파이썬 구현 (0) | 2019.01.12 |
[알고리즘] 백준 - 1260 DFS와 BFS 파이썬 구현 (0) | 2019.01.12 |