백준발행일 2023. 9. 9.원본 https://blog.naver.com/jword_/223206901692 ↗

코딩테스트 준비, 반복문 연습 더하기 사이클

코딩테스트 준비, 반복문 연습 더하기 사이클 — #코딩테스트준비 #반복문연습 #더하기사이클 AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성...

#백준#Naver Blog

#코딩테스트준비 #반복문연습 #더하기사이클

​

AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다.

\본 게시글은 PC버전에 최적화되어있습니다.\

이미지

더하기 사이클

자바 연습문제

문제

💡 0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. ​ 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. ​ 다음 예를 보자. 26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다. 위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다. ​ N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

문제풀이

문제풀이를 위한 접근

필요한 기능들을 먼저 정리해보았습니다.

정수로 입력을 받는다. or 문자열로 입력받는다.입력된 정수를 분리한다.분리된 정수를 서로 더해 새로운 수를 만든다.사이클의 길이를 측정한다.

이정도면 될 것 같고, 천천히 하나씩 구현해보겠습니다.

​

문자열로 풀어보기

처음 생각해본 것은 문자열로 입력값을 받고 idx로 문자를 나눠 새로운 문자를 만들어 사이클을 구하는 것이었습니다.

num = input()plus\_num = 0new\_num = ""count = 0right\_idx = 1left\_idx = 0 while(1): count += 1 plus\_num = int(num\[left\_idx\]) + int(num\[right\_idx\]) plus\_num = str(plus\_num)​ if int(plus\_num) < 10: plus\_num = "0" + plus\_num​ new\_num = num\[right\_idx\] + plus\_num\[right\_idx\] print(plus\_num, new\_num, num) if num == new\_num: break else: num = new\_num​print(count)​

처음에 입력값을 받고, 루프안에서 입력값이 계속 변하는 형태로 구현을 하였습니다. 하지만, 초기 num과 새로운 new\_num이 절대로 같아지는 구조가 나오지 않아 무한루프를 탈출하지 못합니다.

​

num = input()first\_num = numplus\_num = 0new\_num = ""count = 0right\_idx = 1left\_idx = 0 while(1): count += 1 plus\_num = int(num\[left\_idx\]) + int(num\[right\_idx\]) plus\_num = str(plus\_num)​ if int(plus\_num) < 10: plus\_num = "0" + plus\_num​ new\_num = num\[right\_idx\] + plus\_num\[right\_idx\] print(plus\_num, new\_num, num) if first\_num == new\_num: break else: num = new\_num​print(count)​

이를 해결하기 위해 초기 값을 따로 저장해둘 필요가 있었습니다. first\_num 변수를 새로 만들어 값을 저장후 first\_num과 new\_num이 일치하면 루프를 탈출하도록 구현했더니 잘 실행됩니다.

​

문자열 풀이 후기

문자열로 구현을 하다보니 꽤나 까다로운점이 많았습니다. 무엇보다 형식 맞지않아서 더하기나, 비교문에서 형변환을 계속해줘야 해서 코드가 깔끔하지 못합니다.

​

문자열은 형변환때문에 복잡하니 좀 더 깔끔하게 정수로 자릴수를 나눠 구형해보겠습니다.

정수로 입력받기

정수를 나누기

정수로 입력받을때는 각 자릿수를 어떻게 나눌지가 문제입니다. 이때 이전에 다뤘던 자릿수나누기를 참고하여 코드를 작성하였습니다.

num = int(input())first\_num = num​count = 0​while (1): count += 1 right = num % 10 left = num // 10​ plus\_num = left + right plus\_right = plus\_num % 10​ new\_num = right \* 10 + plus\_right print(plus\_num, new\_num) if(first\_num == new\_num): break else: num = new\_num​print(count)

자릿수를 몫과 나머지로 나눠서 훨씬 분리하기 쉬워졌습니다. 게다가 정수형태라 계산하기에도 편리합니다!

​