-
프로그래머스 문제 풀이: 콜라츠 추측 (Level 1)코딩 2025. 3. 22. 13:41
문제 설명
1937년 Collatz에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면 모든 수를 1로 만들 수 있다는 이론입니다.
작업 과정
- 입력된 수가 짝수라면 2로 나눕니다.
- 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
- 결과로 나온 수에 같은 작업을 반복합니다.
- 이 작업을 1이 될 때까지 반복하며, 반복 횟수를 반환합니다.
- 단, 500번 반복해도 1이 되지 않는다면 -1을 반환합니다.
제한 사항
- 입력된 수 num은 1 이상 8,000,000 미만인 정수입니다.
입출력 예시
numresult
6 8 16 4 626331 -1 문제 해결: 사고 과정
이 문제를 처음 접했을 때, 반복문을 활용하여 간단한 조건문만으로 해결할 수 있는 문제라고 생각했습니다. 핵심은 주어진 수를 1로 만들기 위한 변환 작업을 몇 번 수행하는지 카운트하는 것입니다.
- 입력값이 1이면 바로 0을 반환해야 합니다. 1은 이미 조건을 충족하기 때문이죠.
- 짝수와 홀수를 구분하여 적절한 연산을 수행하면 됩니다.
- 짝수: num // 2
- 홀수: num * 3 + 1
- 변환 과정을 최대 500번 반복하는 것이 핵심입니다.
- 반복 횟수가 500번을 넘기면 -1을 반환해야 합니다.
- 따라서, while 문을 사용하여 최대 500번까지 반복하도록 설계했습니다.
이러한 사고 과정을 기반으로 코드를 작성해 보았습니다.
나의 코드
def solution(num): # Step 1. 입력이 이미 1이면 0 반환 if num == 1: return 0 # Step 2. 콜라츠 변환 작업을 반복 (최대 500번) count = 0 while num != 1 and count < 500: if num % 2 == 0: # 짝수일 경우 num //= 2 else: # 홀수일 경우 num = num * 3 + 1 count += 1 # Step 3. 변환 도중 1이 되면 횟수 반환, 아니면 -1 return count if num == 1 else -1
실행 예시
print(solution(6)) # 8 print(solution(16)) # 4 print(solution(626331)) # -1 print(solution(1)) # 0
다른 사람의 코드 분석
코드 1: for 문 활용
def collatz(num): for i in range(500): num = num / 2 if num % 2 == 0 else num * 3 + 1 if num == 1: return i + 1 return -1
사고 과정
- for 문을 사용하여 최대 500번 반복하는 방식으로 접근.
- i + 1을 반환하여 몇 번째 반복에서 1이 되었는지 명확히 표현.
- 다만, / 연산을 사용하여 실수 연산이 발생할 가능성이 있음.
코드 2: while 문을 더 간결하게 작성
def collatz(num): cnt = 0 while num != 1 and cnt < 500: num = 3 * num + 1 if num % 2 else num // 2 cnt += 1 return cnt if cnt < 500 else -1
사고 과정
- while 문을 활용해 cnt 변수를 증가시키며 1이 될 때까지 반복.
- if-else 문을 한 줄로 간결하게 작성하여 코드 길이를 줄임.
- // 연산자를 사용하여 정수 연산을 유지함.
마무리
콜라츠 추측 문제는 반복문과 조건문을 활용하여 해결할 수 있는 간단한 문제입니다. 하지만 연산 과정에서 효율성과 코드 가독성을 고려하여 작성하는 것이 중요합니다.
배운 점
- while vs. for 문 선택의 차이.
- 정수 연산을 유지하기 위한 // 사용.
- 코드를 간결하게 만드는 조건문 활용 방법.
'코딩' 카테고리의 다른 글
프로그래머스 문제 풀이 : 올바른 괄호 판단하기 (0) 2025.03.27 프로그래머스 문제풀이 : 문자열 내림차순으로 배치하기 (0) 2025.03.26 프로그래머스 문제 풀이: 약수의 개수와 덧셈 (0) 2025.03.25 node 2023_04_07_TIL.js ...is not defined (2) 2023.04.08 3. 23. 항해 99 온보딩 커리큘럼 사전 스터디 일지(독학, 일기 용도) (2) 2023.03.24