1. 콜라츠 추측(Collatz conjecture)
1937년 이 추측을 처음으로 제기한 로타르 콜라츠의 이름을 딴 추측
3n+1 추측, 울람 추측, 헤일스톤(우박) 수열 등의 이름으로 불림
임의의 자연수가 다음 조작을 거쳐 항상 1이 된다는 추측
- 짝수라면 2로 나눈다.
- 홀수라면 3을 곱하고 1을 더한다.
- 1이면 조작을 멈추고, 1이 아니면 첫 번째 단계로 돌아간다.
2. 파이썬으로 구현할 프로그램
콜라츠 추측을 바탕으로,
입력한 수가 1이 될 때까지 몇 번의 과정을 거치는지 리턴하기
만약 그 수가 500이 넘어간다면, -1을 리턴하기
3. 삽질한 코드
def collatz(num):
count = 0
if count <= 500:
while num > 1:
if num % 2: #홀수일 경우
num = (num * 3) + 1
count += 1
else: #짝수일 경우
num /= 2
count +=1
return count
else: return -1
와 진짜 잘 짰다! 하고 돌렸는데..
count가 500이 넘어가는데도 -1이 반환되지 않고 500보다 큰 값이 반환되었다.
결과 보면서 셀프 디버깅을 해봐도 노답이길래(..ㅠ..) 파이썬 튜터를 돌려 보았다.
내가 간과했던 점은 while문은 그 안에서만 뱅글뱅글 반복문을 돈다는 것.
프로그래밍이 위부터 아래까지 순차적으로 진행되는 건 맞지만,
제어문에서는 그 블록 안에서만 명령들을 수행한다!
따라서 while문 안에 count에 따라 다른 값을 수행하도록 하는 명령문이 없기 때문에 count만 계속 돌리고 있었던 것이다.
4. 최종 작성 코드
def collatz(num):
count = 0
while num > 1:
if count <= 500:
if num % 2: #홀수일 경우
num = (num * 3) + 1
count += 1
else: #짝수일 경우
num /= 2
count +=1
else:
return -1
return count
삽질 코드에서 발견한 인사이트를 토대로
while문 안에 if 조건문을 삽입하여 count 값에 따라 리턴이 달라지도록 만들었다.
아직 기초적인 코드 작성이 미숙하다는 걸 매일 느낀다.
그래도 뚜벅뚜벅 성장해 가는 중 🌱
(22.01.27)
근데 티스토리 코드블럭 입력할 때랑 출력할 때랑 왜 다르지..
열받넹.....ㅎ......
(22.01.30)
수정한 코드블럭 탭키는 왜이렇게 광활해.........
오 블로그 스킨 편집에서 CSS 부분을 손봤더니 볼만해졌다.
갓-구글
'Developing > Algorithm: Python' 카테고리의 다른 글
[python] 백준 boj14502 연구소 (0) | 2022.09.01 |
---|---|
[python] 백준 boj2109 순회강연 (아마도 그리디 풀이법) (0) | 2022.04.04 |
[python] 딕셔너리 Key, Value 값을 뒤집는 함수 구현하기 (0) | 2022.02.01 |