Algorithm/Cordiality
[Codility] Lesson 2) CyclicRotation
devKen
2022. 7. 23. 22:57
코딜리티의 문제들은 무단 복제, 전재와 공개가 금지되어 있습니다. 때문에 문제의 개요와 제 코드만을 공개합니다.
풀이는 스위프트로 진행하였습니다.
문제의 개요
A로 Int 배열이 주어지고 K라는 수로 회전하는 횟수를 지정받습니다.
예를 들어 A가 [1,2,3] 이면서 K가 2라면 배열의 가장 끝 수가 배열의 가장 앞으로 들어가게 됩니다. 그 결과로 답은 [2,3,1]이라는 배열을 리턴해야 합니다.
해답
1차 시도
func solution(_ A: inout [Int], _ K: Int) -> [Int] {
for cnt in 0..<K {
let temp = A.popLast()!
A.insert(temp, at: 0)
}
return A
}
removeLast를 쓰는 것도 나쁘지 않지만 popLast로 배열의 끝을 제거함과 동시에 리턴하는 함수가 존재하여 유용하게 사용할 수 있습니다.
너무 간단한 문제임에도 하나의 테스트 케이스를 통과하지 못 했습니다. 위의 코드로 작동한다면 만약 A가 비어있는 상태로 들어오게 되면 Runtime Error가 발생하는 경우에 대한 대처가 없습니다. 때문에 코드를 다시 작성했습니다.
2차 시도
func solution(_ A: inout [Int], _ K: Int) -> [Int] {
if A.isEmpty {
return A
}
for cnt in 0..<K {
let temp = A.popLast()!
A.insert(temp, at: 0)
}
return A
}
간단하게 빈 배열이 들어올 경우 해당 경우에 연산을 거치지 않고 바로 리턴하게 했습니다. 알고리즘을 작성할 때, 항상 엣지케이스에 유념해야 한다는 것을 알수 있습니다.
실제론 8분 정도 걸린듯 합니다.