콜라츠 추측, 정적분… 문과출신인 저로서는 보자마자 움츠러들게 되는 복잡한 개념들인데요. 겉모습에 쫄(?) 필요는 없습니다. 결국 시키는대로 그대로 하면 풀리는 구현문제입니다. 시간복잡도 같은 것도 크게 신경쓰지 않아도 됩니다.
콜라츠의 추측에 대해서 1이 될 때까지 홀짝에 맞추어 주어진 연상을 하면 됩니다. 그렇게 되면 그래프의 높이들이 나옵니다.
그래프 역시 정적분에 대한 지식이 하나도 없어도 상관 없습니다. 그저 사각형의 넓이만 구할 수 있으면 됩니다. 너비 1이고 2개의 높이를 가진 사다리꼴의 넓이들을 더해서 구간의 넓이를 구할 수 있기 때문입니다. 이상은 코드를 참고해주세요.
func solution(_ k:Int, _ ranges:[[Int]]) -> [Double] {
// 정적분을 통해 크기를 구하는 함수
func area(start: Int, end: Int) -> Double {
var result = 0.0
// 너비 1씩 끊어서 사다리꼴 너비 구하는 공식를 활용
for i in start...(end - 1) {
result += (heights[i] + heights[i + 1]) / 2
}
return result
}
// 콜라츠 연산을 한 숫자를 저장
var collatz = [k]
var k = k
// 1이 될때까지 콜라츠 연산
while k != 1 {
k = k % 2 == 0 ? k / 2 : k * 3 + 1
collatz.append(k)
}
// 넓이를 구해야 하므로 Double로 캐스팅
let heights = collatz.map { Double($0) }
// 각 구간의 넓이를 저장하는 배열
var result = [Double]()
for range in ranges {
// 시작 index와 끝 index
let start = range[0]
let end = collatz.count + range[1] - 1
// 각 index에 대해서 예외처리
if start > end { //👉 너비를 구할 수 없는 경우
result.append(-1)
} else if start == end { //👉 index가 같아서 너비가 0인 경우
result.append(0)
} else {
result.append(area(start: start, end: end))
}
}
return result
}