본문 바로가기

프로그래머스 퀴즈(Python)/level 2

23.02.13 파이썬 코딩 퀴즈#152 우박수열 정적분 (프로그래머스 스쿨)

이번 문제는 우박수열 정적분 문제이다.

콜라츠 추측에 따르면 위의 3가지 연산을 계속 반복하다 보면 모든 자연수 n은 항상 1이 된다는 추측이다.

이 작업에 의해 수가 커졌다 작아지기를 반복하는 모습이 우박이 되는 모습과 비슷하다고 하여 우박수 또는 우박수열로 불리기도 하며, 아직까지 반례가 없다고 한다.

대략 그래프로 그렸을때 위와 같은 꺾은선 그래프가 나오는데, 이를 정적분 해보고 싶어한다고 한다.

이때 x에 대한 범위 [a,b]가 주어진다면 그래프와 2점 a,b 로 둘러쌓인 공간의 면적을 우박수열 정적분이라 해보고 이를 구해보려고 한다.

예를 들어 5를 초항으로 하는 수박수열은 (0,5) => (1, 16) => (2, 8) = > (3,4) => (4,2) => (5,1)이 되고 이를 그래프로 나타나내면 아래와 같다.

즉 오른쪽의 노란 음영 부분의 넓이가 바로 정적분의 결과가 된다.

[0,0] 의 의미는 x의 시작 지점이 0 이고, 끝나는 지점에서 0 번째 까지를 의미한다. 즉 전체를 의미한다.

[0,-1]은 x의 시작지점은 0 이고, 끝나는 지점에서의 -1 번째 즉 4까지를 의미한다.

[2,-3] 은 x의 시작지점은 2 이고, 끝나는 지점에서의 -3 번째 즉 2까지를 의미한다. 넓이가 존재하지 않기 때문에 0 이 된다.

[3,-3] 은 3~2 까지 이며, 이는 유효기간이 존재하지 않으므로 -1.0 을 반환한다.

먼저 hail() 이라는 새로운 함수를 만들어 우박수열을 실행한다.

그리고 이 때 해당 좌표의 넓이 까지도 같이 구해주며, 필요한 건 넓이 이기 때문에 넓이 만 temp 에 저장하고 k 변수는 계속 해당 함수를 돌게 된다.

이제 구해준 넓이를 순환하여 범위를 합산해 주면 되는데, 이때 시작 값이 끝나는 지점보다 크다면 영역이 존재하지 않기 때문에 따로 -1 을 반환하여 예외처리 해준다.