[Swift] 백준 1158 - 요세푸스 순열

sun02·2021년 11월 8일
0

알고리즘

목록 보기
8/52

문제 링크

1번부터 N번까지 사람이 모두 제거될 때까지 K번째 사람을 제거해야하는데, 이때 K번째는 항상 맨 처음에서 시작하는 것이 아니고 제거된 사람에서 K번째이기 때문에 나는 위치 값(count)를 따로 두었다.

위치값은 항상 K만큼 증가하지만 사람 수보다 적어야하기 때문에
나머지값을 사용해야하나 하는 생각이 들었는데 그것보다 더 간단하게 그냥 위치값 = '위치값 - 사람 수' 로 구현해 주었다.


import Foundation

let line = readLine()!.split(separator: " ").map { Int(String($0))!}

let N = line[0]
var K = line[1]

var array = [Int]()

for i in 1...K {
   array.append(i)
}

var setNum = [Int]()
var count = K

while !array.isEmpty {
    
    if count <= array.count {
        setNum.append(array[count-1])
        array.remove(at: count-1)
         count = count + K - 1
    } else {
        count -= array.count
    }
}

print("<" + setNum.map({String($0)}).joined(separator: ", ") + ">")
  • 여기서 배열에 원소값을 1부터 K까지 넣어주기 위해서 for루프를 사용했는데 이것 말고 매우 간단하게 처리 할 수 방법이 있었다.
var array = Array(1...N)

이렇게 하면 바로 1부터 N까지 1간격으로 array배열이 채워진다. (대박적)

  • 또한 문제에서 출력을 배열 [1,2,3,4,5] 형태가 아닌 <1,2,3,4,5>와 같은 형태로 하길 원해서 다음과 같이 따로 처리해주었다...

최종 제출 코드


import Foundation


let line = readLine()!.split(separator: " ").map { Int(String($0))!}

let N = line[0]
var K = line[1]

var array = Array(1...N)
var setNum = [Int]()
var count = K

while !array.isEmpty {
    
    if count <= array.count {
        setNum.append(array[count-1])
        array.remove(at: count-1)
         count = count + K - 1
    } else {
        count -= array.count
    }
}

print("<" + setNum.map({String($0)}).joined(separator: ", ") + ">")

Array(1...5) 진짜 개쩐당...
그리고 앞으로 변수명 신경써서 지어야겠다..
근데 다른 사람들 풀이 보니까 나머지 값으로 다시 풀어봐야겠다 ㅎㅎ;;;

나머지 값 이용한 풀이


import Foundation

let line = readLine()!.split(separator: " ").map { Int(String($0))!}

let N = line[0]
var K = line[1]

var array = Array(1...N)
var count = K-1

print("<",terminator: "")
while array.count != 1 {
    
    if count >= array.count {
        count %= array.count
    }
    
    let target = array.remove(at: count)
    print("\(target), ",terminator: "")
    count += (K-1)
}

print("\(array[0])>")

둘 다 시간은 같게 나오네요! 하튼,, 잼썼다 !

0개의 댓글