해당 문제는 풀이는 단순하지만 요세푸스 문제가 뭔 말인지 이해해야 풀 수 있다는 문제가 있는데, 내용을 요약해보자면 두 숫자를 입력을 받아 왼쪽 숫자로 1부터 N까지 깔아준 후, 오른쪽 숫자인 K번째 숫자들을 제외하면서 출력 양식에 맞게 순서를 나열해주면 되는데
입력으로 7, 3을 받았으니 1 2 3 4 5 6 7 이렇게 깔리게 되는데
3번째 숫자인 3이 빠지고 이후 3차례 뒤인 6이 빠지면 1 2 4 5 7이 되는데
이후에는 7..1..2 이런 식으로 이동하다가 3번째 숫자인 2가 빠지고
4..5..7 이렇게 가다가 7이 빠지는 식으로 3번째 숫자를 빼주면 된다는 거다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] arr = br.readLine().split(" ");
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= Integer.parseInt(arr[0]); i++) {
list.add(i);
}
int i = 0;
int order = 0;
int incre = Integer.parseInt(arr[1]);
StringBuilder ans = new StringBuilder("<");
while (!list.isEmpty()) {
order++;
if (order == incre) {
if (list.size() == 1) {
ans.append(list.get(i)).append(">");
} else {
ans.append(list.get(i)).append(", ");
}
order = 0;
list.remove(i);
i--;
}
i++;
if (i >= list.size()) {
i = 0;
}
}
System.out.println(ans);
}
}
코드로 풀어보자면 입력받은 값에서 왼쪽값인 1부터 N까지 list에 넣어준 후, List가 빌 때까지 계속 while문을 돌려줘야 하는데 핵심은 입력받은 우측의 값인 K번째마다 list에서 값을 빼서 StringBuilder에 계속 담아주고, index가 list의 크기를 넘어가면 0으로 돌리는 식으로 진행해서 모든 수를 빼주면 끝이 난다.
Leave a Reply