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.isEmptytrue일때 while을 끝내는 식으로 변경하였다.