<문제 설명>
예시 (7, 3)
예제 입력
1 2 3 4 5 6 7
제거 시작
현 위치 0
제거 위치 :0 + K = 0 + 3 = 3
제거 3
1 2 4 5 6 7
현 위치 2
제거 위치 :2 + 3 = 5
제거 5
1 2 4 6 7
현 위치 4
제거 위치 :4 + 3 = 7
제거 : X - > 7 > 5(list.size) 초과 따라서 첫 위치로 돌아가면서 탐색
7 % 5 = 2
제거 2번
1 4 5 7
현 위치 1
제거 위치 :1 + K = 4
제거 7
1 4 5
현위치 3
제거 위치 :2 + K = 2 + 3 = 5
5>3(lsit.size) 첫 위치로 돌아가 탐색
5 % 2 = 3
제거 5
1 4
현 위치 2
제거 위치 : 2 + K = 5
5 > 2(list.size)
5%2 = 1
제거 4
package backjoon;
import java.io.*;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main1158 {
public static void main(String[] args) throws IOException {
//입력값 처리
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//결과를 출력하는 BufferedWriter
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
LinkedList list = new LinkedList();
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
for (int i = 0; i <= N; i++) {
list.add(i);
bw.write("<");
int idx = 0; //현재 위치 변수
while (list.size() > 1){
/*
K를 더했을 때 현재 인원수보다 커질 경우 원형으로 앉아서 처음 인원으로 돌아간다.
*/
idx = idx + (K-1) < list.size() ? idx + (K-1) : (idx + (K-1)%list.size());
bw.write(list.get(idx) + " "); //제거된 사람 저장
list.remove(idx); //사람 제거
}
bw.write(list.get(0) +">"); // 마지막 남은 사람 bw에 저장
bw.flush(); // 결과 출력
bw.close();
br.close();
}
}
}
풀때 처음에 리스트를 뺄때 2칸씩 K-1 씩 이동 하면서 뺀다고 생각해서 풀려고 했더니, 생각보다 잘 코드가 안나왔다.
그래서 하나씩 제거를 하면서 리스트 크기에 따라 적용 되는 것을 찾아봐서 풀어보게 되었다.