https://www.acmicpc.net/problem/1158
더보기
흔한 요세푸스 문제입니다.
요세푸스 문제의 첫번째 난관은 없어진 인덱스에서 다음 기점으로 세서 삭제한다는 점이 있습니다. 즉, 죽인(?) 인덱스를 기억해야합니다.
두 번째는 그래서 그 인덱스를 저장한다고 해서 인덱스를 끊임없이 + 하다보면 언젠가는 배열의 크기를 넘어버리는 시점이 옵니다. 그럼 처음으로 다시 돌아와 세야만 합니다.
따라서, 인덱스의 시작 지점을 어디로 보느냐가 중요합니다. 저는 초기값과 죽은 인덱스를 -1로 보고 올라가는 숫자에서 -1을 제외한 값을 인덱스에 더해가며 값을 올렸습니다.
생각해보십쇼. 케이스 중에 7 1의 문제가 있다고 가정합니다.
[1 2 3 4 5 6 7]의 배열에서 요세푸스의 첫번째 숫자를 삭제한다 했을때 0을 삭제합니다.
즉, 1이 올라가도 0 + (-1 + 1)로 0이 됩니다.
7 2여도 마찬가지입니다. 7 2이기 때문에 두 번째 숫자를 삭제해야합니다. 배열로 치면 1이죠. 0 + (-1 + 2) = 1이 됩니다.
그러면
[1 3 4 5 6 7] 이 남습니다. 죽인 인덱스는 1입니다. 여기서 다시 1 + (-1 + 2) = 2가 됩니다. 그럼 4를 삭제하게 됩니다.
[1 3 5 6 7] 이렇게 남게 되겠죠. 빼진 숫자는 리스트를 새로 선언해 순서대로 채워넣기만 하면 됩니다.
따라서 이를 생각해서 식을 세우면
fun main() {
question1158()
}
fun question1158() {
val case = readln().split(" ").map { it.toInt() }
val list = (1 .. case[0]).toMutableList()
val josephus = mutableListOf<Int>()
var index = 0
while (list.size > 0) {
index = if(index + (case[1] - 1) < list.size) {
index + (case[1] - 1)
} else {
(index + (case[1] - 1)) % list.size
}
josephus.add(list.removeAt(index))
}
println("<${josephus.joinToString(", ")}>")
}
반응형
'스터디(beakjoon)' 카테고리의 다른 글
Kotlin] 백준 9536번 풀이 (0) | 2024.09.01 |
---|---|
Kotlin] 백준 2238번 풀이 (1) | 2024.09.01 |
Kotlin] 백준 2606 풀이 (0) | 2024.05.23 |
Kotlin] 백준 15128번 문제 풀이 (0) | 2024.05.17 |
Kotlin] 백준 11282번 풀이 (0) | 2024.05.14 |