https://www.acmicpc.net/problem/1110
문제가 간단해보여서 바로 코딩으로 들어가고 싶었지만,
이런 숫자만 가지고 노는 문제들이 오히려 더 헷갈리는 경우가 많아서
나름 나만의 언어로 바꾸는 작업이라고 생각하며 계획을 작성해보았다.
계획 작성
위처럼 대략적으로 작성하고 나서 코딩을 시작했다.
이번에는 위 계획처럼 완벽하게 되진 않았지만 그래도 문제를 확실히 이해할 수 있어
계획 작성이 도움이 되었다.
#include <iostream>
using namespace std;
int GetFirstDigit(int num)
{
return num / 10;
}
int GetSecondDigit(int num)
{
return num % 10;
}
int MakeNewNumber(int n1, int n2)
{
return (n1 * 10) + n2;
}
int main(void)
{
int input = 0, sum = 0;
int newNumber = -1;
int cycle = 0;
cin>>input;
int target = input;
while(newNumber != target)
{
sum = GetFirstDigit(input) + GetSecondDigit(input);
newNumber = MakeNewNumber(GetSecondDigit(input), GetSecondDigit(sum));
input = newNumber;
cycle++;
}
cout<<cycle<<endl;
}
코드를 보면 계획과 달라진 점은
알고리즘 수행을 위해 newNumber와 sum 외에도 input과 target이라는 변수를 더 사용했다는 것이다.
그 이유는 while문 조건 때문이다.
처음엔 newNumber가 input이랑 같지 않으면 반복하라고 했는데,
newNumber를 통해 자리수를 구하려면 input의 값을 newNumber에 넣어주어야 했고,
그러면 바로 같아져서 반복이 종료되었다.
또 하나 포인트는 newNumber를 -1로 초기화했다.
테스트 케이스 중 0을 넣으면 1이 나와야하는 게 있는데,
newNumber의 초기값이 0이면 target도 0이 되서 반복없이 종료되기 때문이다.