whiled의 무한루프

김건웅·2026년 1월 6일
post-thumbnail

오늘의 강의를 보던 중 콜라츠의 추측을 python으로 구현해보라는 과제를 받아 시도하게되어었습니다.

콜라츠의 추측은 어느 수를 대입해도 아래 방법으로 반복하면 1이 된다라는 것으로 이해 했습니다

콜라츠의 추측
- 한 수를 정한다.
- 그 수가 짝수이면 2로 나눈다.
- 그 수가 홀수이면 3을 곱하고 1을 더한다.
- 위 과정을 거친 수를 1이 될때까지 반복한다.

먼저 한 수(number)를 정한다를 저는 현재 python으로 구현을 해야하니 아래와 같이 구현해봤습니다.
한수를 정한다 -> a = input("숫자입력 : ")
그 수가 짝수이면 -> if a%2 ==0
그 수가 홀수이면 -> elif a%2!=0
위과정을 거쳐 1이 될때까지 반복한다 -> while문 사용필요

라고 생각을 했고 한번에 성공할꺼란 자신감과 함께 시작했습니다.

일단 머리속에의 순서는 아래와 같았습니다

--------머리 속------------

숫자 입력
짝수 홀수 판별
해당 수에 관한 과정 진행
1인지 검사
1이 아니면 반복
1이면 스톱

-------------------------

먼저 초기 코드는 아래와 같습니다.

저 코드를 짜고 뿌듯했었습니다 ㅎ 한번에 성공 할줄 알았습니다. 기대에 찬 마음으로 실행을 시켰고

에러 라고 하기엔 아무 메세지가 뜨지 않고 이상했습니다.
처음 본 상황이였습니다.
이게 뭘까하면서 검색을 해보았고 무한루프 라는걸 알게되었습니다.

왜 이런 상황이 나온건지 이해가 잘 되지 않았고 다시 검색을 해보았습니다.

검색결과로는 해당 과정 마지막에 b가 1이 아니였을때 다시 처음에 입력 되었던 값 a 로 다시 처음부처 시작하면서 똑같은 값이 계속 반환되었고 이로인해 무한루프에 빠지게 되었다라고 이해를 했습니다.

"그럼 continue가 아니라 b=a로 바꾸면 다시 b를 a로
대입되니 탈출 할수 있겠다. 라는 생각으로 코드를 수정했습니다.
정말 그것만 건들였고 다시 무한루프에 빠지게되었습니다.
왜 그런지 지금의 저로써는 이해할수 없었습니다.

문제가 무었일까 하다 b=a를 a=b로 바꾸어보았습니다.
한 5번정도 계속 실행을 해보다보니 에러메세지가 전과 다르다는 것을 알게 되었습니다.
에러 메세지 는 아래와 같았습니다

검색을 해본결과는 파이썬 인터프리터가 실행중에 시스템 명령어를 입력했기 때문에 파이썬문법으로 해석이 안되었다라고 나왔고 저는 이것을 무한루프 중에 명령어를 입력했을때 나오는 에러라고 생각했습니다.
그래선 전 vscode를 종료 후에 다시 실행했습니다.
일단 다시 터미널은 정상처럼 보였고 무한루프에서 나온것으로 보였기에 수정된 코드를 실행했습니다.
이번엔 다른 에러가 나왔고 에러 내용은 아래와 같았습니다.
입력된 a의 type이 str이라 발생하는 에러라고 생각했고 input 앞에 int를 추가했습니다.
그후에 실행을 했고 숫자입력까지는 성공했으나 print(i)의 값은 제가 원한 값이 아니였습니다.

i에 1.0이란 값이 왜 들어있으며 왜 하나만 있지..? 라는 생각을 하게되었고 코드를 다시 살펴보았습니다.
현재 6이라는 값을 입력했을때 첫번째 if문으로 들어가 2나누어졌고 b에 대입된후 2번쨰 if문으로 들어가 1인지 아닌지를 검사 받고 아니라는 검사가 끝나고 다시 a에 대입되어 똑같은 루프를 반복했습니다. 1.0이란 값이 나온이유는 b가 1이 되었을때만 i리스트에 추가가 된다로 이해했고 다시 아래와 같이 수정을 했습니다.


값이 float형태로 출력이 된것에서 a/2을 하는 과정에서 반환값이 float로 나왔기 때문이라고 생각했습니다. 이 부분에 대해서는 a/2는 나누기 이고 a//2는 몫을 구하는 것으로 알고있었고 몫을 정수형태로 반환해주니 "/"를 추가했습니다.

코드를 실행했을때 원하는 값들이 나왔습니다.

값이 나온것에 다행이라고 생각을 하던 와중 코드들이 중첩된부분이 많다는 것을 알게 되었고 한번 보기좋고 간단하게 만들어봐야겠다는 생각을 했습니다.

먼저 .append(b)가 4번이나 들어가있어 이걸 먼저 줄이고 싶었고 어차피 첫번째 if문이 끝나고 난 뒤 b를 i에 추가하고 두번째 if문을 실행해도 값은 똑같을꺼 같다는 생각을 했고 아래와 같이 수정했습니다.

실행했을때는 정상값이 출력되었습니다.

새벽에 혼자 공부하다 쉽다 생각하고 했던것들에서 막히는 경험을 했고 한참동안 빠져나가지 못해 답답하기도 하고 막막하기도 했습니다. google이라는 선생님께 도움을 받아 해결을 했지만 계속 하다보면 언젠간 혼자서 해결할 날이 올꺼라 믿습니다.
이상 우당탕탕 무한루프 탈출기였으며
개발자가 되기위해 나름 노력중인 초보자 였습니다.

0개의 댓글