문제
조세퍼스 문제는 다음과 같다.
1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 M(≤ N)이 주어진다. 이제 순서대로 M번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, M)-조세퍼스 순열이라고 한다. 예를 들어 (7, 3)-조세퍼스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.
N과 M이 주어지면 (N,M)-조세퍼스 순열을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 M이 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ M ≤ N ≤ 1,000)
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 | class Queue: def __init__(self): self.queue = [] def push(self, num): self.queue.append(num) def pop(self): return self.queue.pop(0) if len(self.queue) != 0 else -1 def size(self): return len(self.queue) def empty(self): return 1 if self.size() == 0 else 0 def front(self): return self.queue[0] if self.size() != 0 else -1 def back(self): return self.queue[-1] if self.size() != 0 else -1 def max(self): return max(self.queue) n, m = map(int, input().split()) queue1 = Queue() output_str = "<" for i in range(1, n+1): queue1.push(i) while(True): for i in range(m-1): queue1.push(queue1.pop()) output_str = output_str + str(queue1.pop()) if queue1.empty() == 1: break else: output_str = output_str + ", " print(output_str + ">") | cs |
코드 - CircularQueue
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 | class CircularQueue(): def __init__(self, size): self.queue = [0 for x in range(size + 1)] self.front = 0 self.rear = 0 self.max_size = size self.list_size = size + 1 def push(self, num): if (self.rear + 1) % self.list_size == self.front: return -1 self.queue[self.rear] = num self.rear = (self.rear +1) % self.list_size def pop(self): if self.size() == 0: return -1 temp = self.queue[self.front] self.front = (self.front + 1) % self.list_size return temp def size(self): if self.front == self.rear: return 0 elif self.rear > self.front: return self.rear - self.front else: return self.max_size - (self.front - self.rear) + 1 def empty(self): return 1 if self.front == self.rear else 0 def max(self): return max(self.queue) def print(self): print(self.queue) print(self.front) print(self.rear) n, m = map(int, input().split()) queue = CircularQueue(n) output_str = "<" for i in range(1, n+1): queue.push(i) while(True): for i in range(m-1): queue.push(queue.pop()) output_str = output_str + str(queue.pop()) if queue.empty() == 1: break else: output_str = output_str + ", " print(output_str + ">") | cs |
'끄적 > Algorithm' 카테고리의 다른 글
[알고리즘] 백준 - 5430 AC 파이썬 구현 (0) | 2019.01.17 |
---|---|
[알고리즘] 백준 - 1021 회전하는 큐 파이썬 구현 (0) | 2019.01.16 |
[알고리즘] 백준 - 1966 프린터큐 파이썬 구현 (0) | 2019.01.12 |
[알고리즘] 백준 - 1260 DFS와 BFS 파이썬 구현 (0) | 2019.01.12 |
[알고리즘] 백준 - 10845 큐 파이썬 구현 (0) | 2019.01.10 |