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
'코딩테스트' 카테고리의 다른 글
[백준][C++] 4673 문제 : 셀프 넘버 (0) | 2023.08.24 |
---|---|
[C++][백준] 2839 문제 : 설탕 배달 (0) | 2023.08.15 |
[백준][C++] 19532 문제 : 수학은 비대면강의입니다 (0) | 2023.08.15 |
[C++] 백준 2798 문제 : 블랙잭 (0) | 2023.08.14 |
[C++] 백준 1085 문제 : 직사각형에서 탈출 (0) | 2023.08.09 |