알고리즘/백준
[백준1158, Java] 요세푸스 문제
일도이동
2020. 10. 20. 22:19
반응형
문제
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
Josephus josephus = new Josephus(N, K);
while(!josephus.circle.isEmpty()){
josephus.next();
}
ArrayList<Integer> jArray = josephus.getJArray();
bw.write("<");
for(int index = 0 ; index<jArray.size(); index++){
if(index==jArray.size()-1){
bw.write(String.valueOf(jArray.get(index)));
}
else{
bw.write(jArray.get(index)+", ");
}
}
bw.write(">");
bw.flush();
}
}
class Josephus{
LinkedList<Integer> circle;
ArrayList<Integer> jArray;
int N;
int K;
int pointer;
Josephus(int N, int K){
this.N = N;
this.K = K;
this.pointer = 0;
circle = new LinkedList<>();
for(int num = 1; num<=N ; num++) {
circle.add(num);
}
jArray = new ArrayList<>();
}
public void next(){
pointer += (K-1);
pointer = pointer%circle.size();
jArray.add(circle.remove(pointer));
}
public int getPointer(){
return pointer;
}
public ArrayList<Integer> getJArray(){
return jArray;
}
public LinkedList<Integer> getCircle(){
return circle;
}
}
반응형