본문 바로가기
코딩 테스트/백준

[백준] (Swift) 11866번: 요세푸스 문제 0

by Dev.Andy 2023. 5. 26.

머리말

문제 링크

11866번: 요세푸스 문제 0

이 문제를 선택한 이유

  • 낯선 문제를 접했을 떄 적절한 반복문과 조건문을 사용하기 위함
  • 구현 문제 연습

풀이

  • 이 문제의 핵심은 배열의 인덱스가 초과할 때, 얼마만큼 처음의 인덱스로 돌아가서 인덱스를 구하는지이다.
  • 나머지 연산자를 활용하여 배열의 길이만큼을 나눈 나머지를 구해 인덱스 초과를 방지한다
// 입력
var input = readLine()!.split(separator: " ").map { Int($0)! }

// n, k 할당
let n = input[0] // 7
let k = input[1] // 3

// 배열 할당
var circle = Array(1...n)

// 인덱스 초기화
var order = [Int]()
var index = 0

// 원이 없어질 때까지 반복
while !circle.isEmpty {
    index = (index + k - 1) % circle.count
    order.append(circle[index])
    circle.remove(at: index)
}

// 순서의 요소를 문자열로 변환하여 ", " 단위로 조합
let sequence = order.map { String($0) }.joined(separator: ", ")

print("<", sequence, ">", separator: "")

 

꼬리말

그새 어색해진 Swift 문법

  • 오랜만에 파이썬에서 스위프트로 문제를 푸려니 사소한 문법과 메서드들이 발목을 잡았다.

기억해 두어야 할 문법들

  • Array(1…n) → [1, 2, …, n]
  • remove(at: n) → n번째 인덱스의 요소 제거
  • .joined(separator: " ") → 공백 단위로 Array<String>을 한 문자열로 조합

댓글