정수 리스트 num_list와 정수 n이 주어질 때, num_list를 n 번째 원소 이후의 원소들과 n 번째까지의 원소들로 나눠 n 번째 원소 이후의 원소들을 n 번째까지의 원소들 앞에 붙인 리스트를 return하도록 solution 함수를 완성해주세요.
제한사항
입출력 예
num_list | n | result |
---|---|---|
[2, 1, 6] | 1 | [1, 6, 2] |
[5, 2, 1, 7, 5] | 3 | [7, 5, 5, 2, 1] |
[5, 2, 1, 7, 5]에서 세 번째 이후의 원소는 [7, 5]이고 세 번째까지의 원소는 [5, 2, 1]입니다. 두 리스트를 이어 붙이면 [7, 5, 5, 2, 1]가 됩니다.
새로운 배열을 형성한다고 했을 때, num_list의 element가 새로운 배열의 어느 index에 위치하는지 위치 계산을 하기로 결정.
n번째 이후의 element들은 밀려서 앞으로 당겨진다는 의미를 고려해서 다음을 계산해보았다.
index: 0..<count
index 0: num_list[0] --> new[2]: 5 - 3 + 0
index 1: num_list[1] --> new[3]: 5 - 3 + 1
index 2: num_list[2] --> new[4]: 5 - 3 + 2
index 3: num_list[3] --> new[0]: 3 - 3
index 4: num_list[4] --> new[1]: 4 - 3
뺄셈에서 받아내림이 존재하듯, 규칙에 의해 밀려날 element들은 num_list 배열의 크기를 빌려와 새로운 자리를 찾는다.
식으로 나타내면 다음과 같다.
index < n ? new[count - n + index] = num_list[index] : new[index - n] = num_list[index]
import Foundation
func solution(_ num_list:[Int], _ n:Int) -> [Int] {
var temp = Array(0..<num_list.count)
for index in temp {
if index < n {
temp[num_list.count - n + index] = num_list[index]
} else {
temp[index - n] = num_list[index]
}
}
return temp
}
n을 기점으로 밀리고 옮기는 작업을 배열 크기 내에서 반복되는 사이클이라고 보면, 결국 index는 나머지 값이 얼마인지에 따라 결정되는 개념과 동일함을 알 수 있다.
기점이 되는 n을 직접 받으므로, 다른 계산 없이 바로 부분배열을 구해서 새로운 배열로 만드는 작업도 가능하다.
import Foundation
func solution(_ num_list:[Int], _ n:Int) -> [Int] {
//1. num_list가 2번 반복되는 배열 생성 후, n부터 n+count-1 까지 element만 추출: count
//0...count-1 중 n...count-1: count-n
//count...count*2-1 중 count...n+count-1: n
return Array((num_list + num_list)[n..<n + num_list.count])
//2. 문제 그대로 n부터 시작하는 부분 배열과 n 이전까지의 부분 배열 조합
return (Array(num_list[n...] + Array(num_list[..<n]))).flatMap { $0 }
}