콜라츠 추측에 대해서 들어보셨나요?
콜라츠 추측이란 임의의 양의 정수 n에 대해서 홀수 일 경우 3*n + 1을 하고 짝수일 경우 n / 2를 하는데 이를 임의의 양의 정수에 수행하면 항상 마지막은 4 2 1 순으로 수렴한다는 것이 콜라츠 추측입니다.
5에 대해서 이 과정을 수행해보면
5 -> 홀수 -> 5 x 3 + 1 -> 16
16 -> 짝수 -> 16 / 2 -> 8
8 -> 짝수 -> 8 / 2 -> 4
4 -> 짝수 -> 4 / 2 -> 2
2 -> 짝수 -> 2 / 2 -> 1
1 -> 홀수 -> 1 x 3 + 1 -> 4
4 -> 짝수 -> 4 / 2 -> 2
2 -> 짝수 -> 2 / 2 -> 1
...
...
결과적으로 마지막에는 4 -> 2 -> 1이 계속 반복이 됨을 알 수 있습니다. 즉, 마지막 수는 반드시 1이 됩니다.
아직 증명되지 않은 문제이며 곱셈 나눗셈만 알면 쉽게 이해할 수 있는 문제입니다.
근데 우리는 프로그래밍적으로 생각을 해야합니다.
해당 문제를 프로그래밍 적으로 생각해보면 다음과 같을 수 있습니다.
1. 홀수 일 때 3*n + 1, 짝수일 때 n / 2을 계산해야 한다.
2. 홀수, 짝수를 판별하는 방법?
3. 무엇을 반복해야 1까지 갈까?
4. 그렇다면 반복은 얼마나 해야하나?
1. 홀수 일 때 3*n + 1, 짝수일 때 n / 2을 계산해야 한다.
-> 이 문제는 쉽게 해결이 가능합니다. 그냥 그 수에 맞게 계산을 해주면 됩니다.
2. 홀수, 짝수를 판별하는 방법?
-> 코딩을 많이 해보신 분들은 이러한 부분은 자면서도 술술 나올테지만 처음 접하거나 생각해본 적이 없는 분들은 어려울 수도 있습니다.
우선 판별을 하려면 특징(공통점)을 잡을 수 있어야 합니다.
홀수들의 특징, 짝수들의 특징 파악하면 조건을 만들 수 있습니다.
홀수는 1, 3, 5, 7, 9, ...
짝수는 2, 4, 6, 8, 10, ...
짝수는 모두 2로 나누어 떨어진다는 특징이 있습니다. 2 나누기 2는 1, 4 나누기 2는 2, 6 나누기 2는 3....
그러나 이 부분은 공통점이 보이지 않습니다.
보통 나누기를 생각할 때 대부분 몫을 생각하기 쉬워 그럴 수도 있습니다. 나머지를 생각해보겠습니다.
2 나누기 2의 나머지는 0, 4 나누기 2의 나머지는 0, 6 나누기 2의 나머지는 0, .....
짝수들의 특징을 눈치 채셨나요?
2로 나눈 나머지가 모두 0과 같습니다. 그렇다면 홀수들을 어떨까요? 홀수는 2로 나눌 때 나머지가 모두 1입니다.
여기까지 알아본 내용을 코드로 작성하면 이렇습니다.
n = 5 # 임의의 양의 정수 선택
if n % 2 == 0: # n을 2로 나눈 나머지가 0과 같다면?
n = int(n / 2)
else: # 모든 짝수의 나머지는 홀수 이므로 else를 사용한다.
n = n * 3 + 1
print(n)
근데 이렇게 하면 딱 한 번밖에 볼 수 없습니다. 그래서 반복을 해야합니다.
3. 무엇을 반복해야 1까지 갈까?
-> 당연히 if 문부터 print(n)까지 반복을 해야합니다.
4. 그렇다면 반복은 얼마나 해야하나?
-> 마지막에 1이 나올 때까지 반복을 해야합니다. 1이 나오는 순간 4 2 1 4 2 1이 반복이 되기 때문입니다.
그렇다면 1이 나올 때까지라는 말은 언제 1이 나올지 모른다는 말과 같으며 특정 조건을 의미하는 말이기도 합니다.
때문에 특정 범위에 따라 반복할 수 있는 for문 보다는 조건에 따라 반복하는 while문이 적절하다고 볼 수 있습니다.
따라서 코드는 다음과 같습니다.
n = 5 # 임의의 양의 정수 선택
while n != 1:
if n % 2 == 0: # n을 2로 나눈 나머지가 0과 같다면?
n = int(n / 2)
else: # 모든 짝수의 나머지는 홀수 이므로 else를 사용한다.
n = n * 3 + 1
print(n, end=" ") # 한 줄로 볼 수 있게 해보았습니다.
이 코드를 실행하면 변화를 볼 수 있는데 단순히 숫자로보면 뭔가 밋밋합니다.
그래서 이 것을 그래프로 나타낼 수 있게 해보겠습니다.
터틀 모듈을 사용하면 쉽게 보이는데 요즘 tkinter 모듈 사용법을 올리고 있습니다. 때문에 tk모튤을 이용해서 표현을 해보도록 하겠습니다.
'프로그래밍 > 문제 풀이' 카테고리의 다른 글
[콜라츠 추측] 파이썬 GUI로 콜라츠 추측 알아보기2 (0) | 2022.11.03 |
---|---|
[100명의 죄수 문제] 파이썬으로 확률 알아보기 (0) | 2022.10.07 |
댓글