[C/C++] BOJ 문제번호 1110 더하기 사이클
문제를 풀기 전 간단하게 int형 숫자를 자릿수 별로 쪼개는 방법을 간단하게 소개하겠다. 만약 주어진 int형이 몇자리 숫자인지만 안다면 간단하게 풀리는 문제이다. 이 문제의 경우 범위가 0부터 99로 최대 자릿수는 2자리이다. 즉, 1번의 나눗셈 과정만 거치면 각 자리의 숫자를 분리할 수 있다. 주어진 숫자를 X라 하자. 이 X가 한자리 숫자인지 두자리 숫자인지 모른다고 가정하자. 주어진 X를 10으로 나누고 나눈 몫을 따로 저장 후 X의 나머지를 다른 변수에 저장한다. 한자리 숫자의 경우 몫은 0이 저장될 것이고 나머지 값이 X그대로 저장이 될 것이다. 반대로 X가 두자리 숫자일 경우 10의 자리 숫자가 몫으로서 첫번째 변수에 저장이 될 것이고 나머지는 1의 자리 숫자로 10으로 나눈 나머지 값이 두번째 변수에 저장이 될 것이다. 이런 식으로 각 자리 숫자를 쪼개서 볼 수 있다. 문제로 돌아가서 이 문제의 핵심은 주어진 규칙을 코드화 하는 것이 관건이다. 먼저 위에서 설명한 방식으로 주어진 숫자를 각 자릿수로 쪼갠 후 더한다. 더한 값을 임시로 저장하고 쪼개기 전 1의 자리 숫자가 이제 다음 숫자의 10의 자리 숫자가 될 것이다. 그리고 더한 값의 1의 자리 숫자는 다음 숫자의 1의 자리 숫자가 되는 형식이다. 이 패턴을 계속 반복하다 보면 첫번째 주어진 숫자로 돌아가게 되는데, 돌아가기까지 몇 회 반복을 해야하는지 세는 것이다.1. 주어진 숫자를 10의 자리와 1의 자리로 나눈다.2. 다음 숫자의 10의 자리 수는 이전 숫자의 1의 자리 숫자이다.3. 다음 숫자의 1의 자리 수는 이전 숫자의 10의 자리와 1의 자리를 더한 값의 1의 자리 숫자이다.4. 새롭게 구해진 다음 숫자를 가지고 1~3을 반복하면서 반복한 횟수를 기록한다.5. 새롭게 구해진 숫자가 처음 주어진 숫자와 같은지 체크한다.
#include <iostream>
int solution(int N) {
int answer = 0;
int Q, temp; // Q: 정해진 규칙대로 계산 후 나온 숫자, temp: 10의 자리 숫자와 1의 자리 숫자의 합을 임시로 저장하는 변수
Q = N; // 초기 Q를 N으로 초기화하고 시작
while (true) {
temp = (Q / 10) + (Q % 10); // temp에 Q를 10으로 나눈 몫과 10으로 나눈 나머지를 더해 저장(각 자릿수를 더하는 과정)
Q = (Q % 10) * 10 + (temp % 10); // Q의 1의 자리가 다음 숫자의 10의 자리, 각 자릿수를 더한 값의 1의 자리가 다음 숫자의 1의 자리
temp = 0; // 재사용 될 temp를 0으로 초기화
answer++; // 1회의 규칙이 적용되어 새로운 숫자가 나올때 마다 기록
if (N == Q) break; // 초기 주어진 숫자 N과 새롭게 계산된 Q가 같을 경우 반복문을 빠져나감
}
return answer;
}
int main() {
int N; // 초기 주어지는 숫자 N
scanf_s("%d", &N);
printf("%d\n", solution(N));
}