728x90

문제

 

소스코드1

#include<iostream>

using namespace std;

int Calculate1(int n)
{ //26 입력시 결과는 6
	int result = n % 10;
	return result;
}
int Calculate2(int n)
{ //26 입력시 결과는 8
	int sum = 0;
	while (n > 0)
	{
		sum += n % 10;
		n /= 10;
	}

	return sum;
}

int main() 
{
	int repeat = 0;
	int input = 0;
	int original = 0;
	cin >> input;
	original = input;
	while (true)
	{
		repeat++;
		int calculatedSum = Calculate2(original); 
		if (calculatedSum < 10) 
		{
			original = Calculate1(original) * 10 + calculatedSum;
		}
		else //만약 10이 넘으면 뒷자리만 받아옴
		{
			original = Calculate1(original) * 10 + calculatedSum % 10;
		}
		if (input == original)
		{
			cout << repeat;
			return 0;
		}	
	}
	return 0;
}

 

풀이

코드가 길지만 정말 간단한 문제이다.

26을 입력하면 2 + 6 = 8 이 나오고 새로운 수는 68이라고 했으니 이중 필요 없는 숫자는 2이다

그러니 입력값을 두 정수로 분리하고 뒷자리와 두 수를 더한 결과만 필요한 셈이다.

int Calculate1(int n)
{
    int result = n % 10;
    return result;
}

위 함수를 통해 뒷자리 수 하나만 받아올 수 있다.

int Calculate2(int n)
{
    int sum = 0;
    while (n > 0)
    {
        sum += n % 10;
        n /= 10;
     }
     return sum;
}

그리고 위 함수를 통해 입력값인 n을 두 수로 분리하고 더한 값을 구할 수 있다.

 

만약 Calculate2가 한자리 정수면 문제가 없지만 두 자리 정수라면 문제가 된다.

 

그래서 

int calculatedSum = Calculate2(original);
if (calculatedSum < 10)
{
original = Calculate1(original) * 10 + calculatedSum;
}
else
{
original = Calculate1(original) * 10 + calculatedSum % 10;
}

Calculate2가 10을 넘는다면 %10을 해준것이다.

 

 

소스코드2

#include<iostream>
using namespace std;

int main() 
{
    int input, original;
    cin >> input;
    original = input;
    int count = 0;
    
    do
    {
        input = (input % 10) * 10 + (input / 10 + input % 10) % 10;
        count++;
    } while (input != original);

    cout << count;

    return 0;
}

 

풀이

소스코드 1번에 비해 매우 간단한 코드라고 할 수 있지만 

계산식이 많다 보니 개인적으로 1번에 비해 조금 헷갈렸다.

 

(input % 10) * 10 + (input / 10 + input % 10) % 10;

input이 26이라고 했을 때 결과로 동일하게 68이 나온다.

 

 

 

728x90

+ Recent posts