728x90
SMALL
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

def collatz_sequence(k):
sequence = [k]
while k > 1:
if k % 2 == 0:
k //= 2
else:
k = 3 * k + 1
sequence.append(k)
return sequence
def calculate_areas(sequence):
areas = []
for i in range(len(sequence)-1):
x0, x1 = i, i+1
y0, y1 = sequence[i], sequence[i+1]
area = (y0 + y1) / 2
areas.append(area)
return areas
def solution(k, ranges):
answer = []
sequence = collatz_sequence(k)
total_length = len(sequence)-1
areas = calculate_areas(sequence)
for a, b in ranges:
end = total_length + b
# 시작점이 끝점보다 커서 유효하지 않은 구간이 주어질 때
if a > end:
answer.append(-1.0)
else:
answer.append(sum(areas[a:end]))
return answer
왜 이렇게 풀었을까?
- 처음 문제를 이해하기가 조금 까다로웠는데, 기본 골자는 우박 수열을 만들고 수열을 이용해 구간별 면적을 구하고, 주어진 범위(ranges) 내에서 해당 면적들을 출력하면 되는 문제였습니다.
- 우박 수열을 만드는 것은 어렵지 않았습니다. 문제에 제시된 조건만 그대로 코드에 옮겨 함수(collatz_sequence)로 구현했습니다.
- 각 구간의 면적을 구하는 것도 그렇게 어렵진 않습니다. 각 구간의 높이는 1이기에 윗변의 길이가 y0, 아랫변의 길이가 y1인 사다리꼴의 면적을 구하는 것과 같았습니다.
- ranges를 코드에 녹이는 것이 가장 골치 아팠는데, 예를 들어 [0, 0]으로 range가 주어지면 이는 전체(0부터 우박 수열의 길이까지의 구간)를 적분하라는 뜻이고, [0, -2]이 주어지면 이는 0부터 (우박 수열의 길이 - 2)까지의 구간을 적분하라는 뜻이 됩니다.
- 이해 후에는 예외 처리를 포함해서 바로 쉽게 구현할 수 있었던 문제였습니다.
- 분명 수학 문제인데... 국어를 잘해야겠다는 생각이 드는 문제입니다.
728x90
LIST
'알고리즘 문제 풀이 > 프로그래머스 (Level 2)' 카테고리의 다른 글
| 📗 점 찍기 (0) | 2024.12.18 |
|---|---|
| 📗 문자열 압축 (0) | 2024.12.16 |
| 📗 멀쩡한 사각형 (1) | 2024.11.17 |
| 📗 하노이의 탑 (4) | 2024.11.16 |
| 📗 가장 큰 정사각형 찾기 (2) | 2024.10.11 |