순서대로 M번째 사람을 제거한다.
한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속한다.
이 과정은 N명의 사람이 모두 제거될 때까지 계속된다.
원에서 사람들이 제거되는 순서를 (N,M) - 조세퍼스 순열이라고 한다.
아이디어 1
- 큐를 이용한 문제 해결
1. 지나친 사람은 언젠가 다시 만나야 한다.
2. 매 3번째 사람은 제거되며 다신 만날 일이 없다.
3. 큐의 처음에서 사람을 만날 때 마다 다시 만날 가정을 하고 맨 끝으로 넣으면 된다.
- 구현
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.concurrent.ArrayBlockingQueue;
public class Main{
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
Queue<Integer> in_q = new ArrayBlockingQueue<>(n);
for(int i=1; i<=n; i++)
in_q.add(i);
StringBuffer sb = new StringBuffer();
while(!in_q.isEmpty())
for(int i=0; i<m; i++)
if(!(i==(m-1)))
in_q.add(in_q.poll());
else
sb.append(in_q.poll() + ", ");
System.out.println("<" + sb.toString().substring(0, sb.length()-2) + ">");
}
}
```
- ArrayList를 이용한 문제 해결
1. 한 사람을 제거하고 난 뒤에 지나친 사람을 만나야 한다는 특성을 이용
1. 1 Mod(%) 연산을 이용하여 해당 특성을 구현 가능하다.
2. ArrayList로 인덱스의 처음 위치부터 이동 위치를 기록한다.
3. m-1만큼 이동하고 해당 원소를 삭제한다.
4. size가 전부 줄어들 때까지 반복한다.
- 구현
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main{
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
List<Integer> ll = new ArrayList<>();
for(int i=1; i<=n; i++)
ll.add(i);
StringBuffer sb = new StringBuffer();
sb.append("<");
int cursor = 0;
while(!ll.isEmpty()) {
cursor = (cursor + (m-1)) % n;
if(ll.size() != 1)
sb.append(ll.get(cursor) + ", ");
else
sb.append(ll.get(cursor) + ">");
ll.remove(cursor);
n--;
}
System.out.println(sb.toString());
}
}
```