코딩테스트 준비, 반복문 연습 더하기 사이클
코딩테스트 준비, 반복문 연습 더하기 사이클 — #코딩테스트준비 #반복문연습 #더하기사이클 AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성...
#코딩테스트준비 #반복문연습 #더하기사이클
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\_numprint(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\_numprint(count) |
|---|
이를 해결하기 위해 초기 값을 따로 저장해둘 필요가 있었습니다. first\_num 변수를 새로 만들어 값을 저장후 first\_num과 new\_num이 일치하면 루프를 탈출하도록 구현했더니 잘 실행됩니다.
문자열 풀이 후기
문자열로 구현을 하다보니 꽤나 까다로운점이 많았습니다. 무엇보다 형식 맞지않아서 더하기나, 비교문에서 형변환을 계속해줘야 해서 코드가 깔끔하지 못합니다.
문자열은 형변환때문에 복잡하니 좀 더 깔끔하게 정수로 자릴수를 나눠 구형해보겠습니다.
정수로 입력받기
정수를 나누기
정수로 입력받을때는 각 자릿수를 어떻게 나눌지가 문제입니다. 이때 이전에 다뤘던 자릿수나누기를 참고하여 코드를 작성하였습니다.
| num = int(input())first\_num = numcount = 0while (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\_numprint(count) |
|---|
자릿수를 몫과 나머지로 나눠서 훨씬 분리하기 쉬워졌습니다. 게다가 정수형태라 계산하기에도 편리합니다!
