본문 바로가기
알고리즘

[Swift 알고리즘] Codility lesson2 - CyclicRotation

by 코코종 2022. 10. 23.
728x90

알로하~~ 안녕하세요 코코종입니닷

요번주에는 왜이리 갓생을 못산것인지.. 허헣... 일이 많았네요

 

그래도 힘내서 한문제 풀어봤습니다.

해당 문제는 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) 다음주엔 더 힘내서 공부해야겠네요!

728x90