풀이 방법
- 주어지는 배열 ranges에서 원소 a는 시작지점, b는 끝 점으로 부터의 offset이다.
1.1 만약 a가 2, b가 -3인데 우박수열 끝 점의 x좌표가 6이라면 [2, 3]이다.
1.2 끝인 6에서부터 -3만큼 떨어진 지점이 최종 범위인것이다.
- 각 지점의 등변사다리꼴을 전부 구해서 배열에 넣으면서 누적으로 더해갔다.
2.1 예를들어 0~0은 0이기 때문에 [0]
2.2 0~1은 3이라면 [0, 3]
2.3 1~2가 5라면 [0, 3, 8]
2.4 구간 index로 넓이를 쉽게 구하기 위해서 누적 합을 이용하였다.
2.5 그래서 만약 [2, 5]의 구간의 넓이를 구하려면 sum_list[5] - sum_list[2]로 쉽게 구할 수 있다.
풀이 코드
def solution(k, ranges):
answer = []
sum_list = [0]
while k != 1:
prev_k = k
if k % 2 == 0:
k = k // 2
else:
k = k * 3 + 1
sum_list.append((prev_k + k) / 2 + sum_list[-1])
end = len(sum_list) - 1
for start, offset in ranges:
range_end = end + offset
if start == range_end:
answer.append(0)
elif start > range_end:
answer.append(-1)
else:
answer.append(sum_list[range_end] - sum_list[start])
return answer