적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Algorithm/Codility

[Swift 알고리즘] Codility: CyclicRotation

hongssup_ 2022. 5. 23. 14:43
반응형

https://app.codility.com/programmers/lessons/2-arrays/cyclic_rotation/

 

Lesson 2 Arrays (Easy)

CyclicRotation

Rotate an array to the right by a given number of steps.

주어진 정수 배열A를 K만큼 오른쪽으로 회전시키는 문제. 

 

입출력 예시

var arr = [3,8,9,7,6]
print(solution(&arr, 3)) //[9,7,6,3,8]

처음에 그냥 print(solution([3,8,9,7,6],3)) 으로 입력값을 주었더니

Cannot pass immutable value of type '[Int]' as inout argument 이라는 에러가 떴다!

처음보는 inout 에 살짝 당황쓰 ;; inout parameter에 대해 먼저 찾아보았다. (참고 : inout parameter란?)

 

내 답안

public func solution(_ A : inout [Int], _ K : Int) -> [Int] {
    let cnt = A.count - 1
    for _ in 0..<K {
        let tmp = A[cnt]
        for i in 0...cnt {
            if i == cnt {
                A[0] = tmp
            } else {
                A[cnt - i] = A[cnt - (i+1)]
            }
        }
    }
    return A
}

답으로 return할 배열을 하나 새로 만들까 생각도 했지만 문제에서 배열 A를 inout으로 설정해둔 걸 보고 

그냥 기본에 충실하게 for문을 두번 돌려, 배열 내 숫자들을 한칸씩 뒤로 미는 작업을 K번 반복하도록 하였다. 

오잉? 87점??? 

테스트 결과를 확인해보니 배열 A에 empty array 가 주어질 경우, runtime error가 난다고 한다. 

당연하지... 배열 A 길이는 0에서 100까지... 빈 배열로 코드를 돌려보니 Index out of range 에러가 뜬다. 

if A.isEmpty { return A }

함수 첫줄에 이렇게 빈 배열일 경우 바로 return 해버리는 코드를 추가해주자..

조건을 잘보자... 실수하지 말자...

 

 

In your solution, focus on correctness. The performance of your solution will not be the focus of the assessment.

문제 마지막에 이렇게 쓰여 있어서 어짜피 기본문제라 그냥 빨리 풀어본다고 간단하게만 생각해봤는데, 사실 나도 안다.. 비효율적인거.. 

길이가 5개인 배열을 99번 회전 시킬 필요는 없잖아?

다음 코드를 추가해 k번 반복시키도록 하는게 좋을 듯. 

k = K % A.count

배열의 길이가 길면? 그래도 한칸씩 k번 밀어줘야 하나? 그냥 배열 하나 새로 생성해서 k번 민 걸 반환하면 안되나?

728x90
반응형

'Algorithm > Codility' 카테고리의 다른 글

[Swift 알고리즘] Codility demo task  (0) 2023.01.04
[Swift 알고리즘] Codility: BinaryGap  (0) 2022.05.21