알로하~~ 안녕하세요 코코종입니닷
요번주에는 왜이리 갓생을 못산것인지.. 허헣... 일이 많았네요
그래도 힘내서 한문제 풀어봤습니다.
해당 문제는 Codility lesson2 - CyclicRotation에서 확인가능합니다
간단하게 설명을 하자면 배열과 몇번이나 rotate 시킬지인 K가 주어지고, 해당 횟수만큼 돌렸을 때의 결과를 보여주는 것입니다.
rotate는 [1, 2, 3, 4] 라고 할 때 [2, 3, 4, 1]로 변환하는 것을 뜻합니다. (처음에 문제를 제대로 안읽어서 반대로 생각했던 나... 눈감아)
어렵지 않은 문제라서 바로 답안을 공개하겠습니다.
public func solution(_ A : inout [Int], _ K : Int) -> [Int] {
// write your code in Swift 4.2.1 (Linux)
var arr = A
var K = K
// 빈배열시 return(빼먹었음)
if arr.count == 0 {
return arr
}
// A.count로 나눈 나머지만큼만 시핼
K = K % A.count
// K의 배수라면 그대로 return
if K == 0 {
return A
}
// K번 rotate
for _ in 0..<K {
let last = arr[arr.indices].popLast()
arr.insert(last!, at: 0)
}
return arr
}
주석으로 설명도 같이 달아봤는데요! 효율성을 위해 K번을 다 돌리지 않고 해당 배열의 길이로 나눈 나머지 만큼만 돌렸습니다.
여담으로 처음에 빈 배열에 대한 처리를 하지 않아서 87%가 되었었습니닷.. 꼭 엣지케이스에 대한 검증을 하고 넘어가야겠네요.(필수필수)
또 popLast()를 쓰기위해서 찾아보니 arr[arr.indices]를 사용해야해서 indices를 알아보니 Range<Int>로 배열의 범위를 안전하게 처리해주더라구요.(빈 배열일때 컴파일 오류를 발생시키지 않기 위해)
removeLast()와 popLast()의 차이도 알아보면 popLast는 element?를 리턴하기 때문에 빈 배열에서 nil을 리턴하지만 removeLast는 컴파일 오류를 발생시켜버립니다.(nil을 리턴하는게 낫겠쥬?)
오늘은 간단하게 한문제를 슬쩍 풀어봤습니다(마음의 짐 -1) 다음주엔 더 힘내서 공부해야겠네요!
'알고리즘' 카테고리의 다른 글
[Swift 알고리즘] Codility lesson3 - FrogJmp (1) | 2022.10.30 |
---|---|
[Swift 알고리즘] Codility lesson2 - OddOccurrencesInArray (0) | 2022.10.30 |
[Swift 알고리즘] Codility lesson1 - BinaryGap (0) | 2022.10.12 |
[Swift 알고리즘] 백준 2206 - 벽 부수고 이동하기 (0) | 2022.03.30 |
[Swift 알고리즘] 백준 7562 - 나이트의 이동 (0) | 2022.03.30 |