코딩테스트

[Swift 알고리즘] Codility - CyclicRotation

유정주 2022. 6. 17. 20:05
반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "Codility - CyclicRotation" 문제를 풀었습니다.

Codility는 포스팅을 어떻게 해야 깔끔할지 고민 중입니다.

결과 스크린샷 + 움짤? 아니면 결과 스크린샷 + 움짤 + 코드? 고민이 되는 부분입니다 ㅎ..

여러 가지 방법으로 포스팅 해봐야겠어요.

 

Github

 

GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

github.com

 

문제 링크

 

CyclicRotation coding task - Learn to Code - Codility

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

app.codility.com

 

풀이

이번 문제는 배열의 원소를 오른쪽으로 K회 움직인 결과를 출력하면 됩니다.

이때 효율성 테스트를 해보지는 않았지만!

맨 앞에 insert를 하는 것은 연산의 오버헤드를 발생 시키므로 매우 비효율적입니다.

 

따라서 저는 reversed( ) -> append( ) -> reversed( ) 하는 방법을 사용했습니다.

reversed( )는 언뜻보면 O(n) 같지만 O(1)의 시간복잡도를 가진 메서드입니다.

그래서 맨 앞에 insert 하는 것보다 훨씬 효율적이에요.

 

만약 가독성이 안 좋다고 생각된다면 메서드로 만들어서 사용하는 것도 방법일 듯 합니다.

 

전체 코드

더보기
import Foundation

public func solution(_ A : inout [Int], _ K : Int) -> [Int] {
    var a = A
    if a.count <= 1 || (a.min() == a.max()) { //비어있거나 모두 차있으면 return a
        return a
    }

    (0..<K).forEach { _ in
        let last = a.popLast()!
        a = a.reversed()
        a.append(last)
        a = a.reversed()
    }

    return a
}


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형