Swift/Swift Codingtest
[Swift] 백준 1158 요세푸스 문제
hyunjuntyler
2023. 3. 25. 11:41
문제 링크
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
문제 풀이
나의 풀이
import Foundation
let input = readLine()!.split(separator: " ").map{Int($0)!}
var n = Array(1...input[0])
var answer : [Int] = []
var k = input[1] - 1
while true {
answer.append(n.remove(at: k))
if n.isEmpty {break}
k = (k + input[1]-1) % n.count
}
print("<" + answer.map{String($0)}.joined(separator: ", ") + ">")
풀이 과정
풀이방법 생각하기
우선 요세푸스 순열을 어떻게 간단하게 구현하느냐가 고민이었다. k
번째를 계속 뽑아내야 하는데 하나를 뽑았기 때문에, 그다음에는 k
에 input[1]-1
을 더해주는 형식으로 k
를 바꿔주면 된다고 생각했고, 배열의 인덱스를 넘어가는 것은 n.count
로 나눈 나머지로 k
를 변경하여 풀어가면 된다고 생각했다.
풀이 과정 중 실수
while !n.isEmpty {
answer.append(n.remove(at: k))
k = (k + input[1]-1) % n.count
}
처음에는 위처럼 n.isEmpty
를 만족할 때 while
루프를 끝내려고 했는데 이렇게 되면 n.count
가 0이 되버리게 될때 문제가 생기게 되어 오류가 났다!
while true {
answer.append(n.remove(at: k))
if n.isEmpty {break}
k = (k + input[1]-1) % n.count
}
n.isEmpty
가 true
일때 while
을 끝내는 식으로 변경하였다.