백준 1110 더하기 사이클 문제이다.
https://www.acmicpc.net/problem/1110
1110번: 더하기 사이클
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,
www.acmicpc.net
설명을 읽어보면 헷갈릴 수 있는 문제인 것 같다.
먼저 문제를 읽어보자면
1) 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다.
2) 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만든다.
EX)
- 26
2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다.
4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
문제가 다소 헷갈릴 수 있는데 정리하자면 주어진 숫자를 정해진 규칙으로 계산하여 같은 수가 나올때까지 얼마나
사이클을 돌리는가를 구하는 문제이다
새로운 수는 두자리 수를 합한 값을 일의자리수로, 두자리 수의 일의자리 수를 10의자리 수로 계산하여 만든다.
위의 예제처럼 26의 경우 두자리를 합한값인 8은 일의자리수로, 26의 일의자리수인 6은 10의자리 수로 계산하여 68이 나온다.
그림으로 나타내자면 이렇다.
코드를 보자면 이렇다.
#include <iostream>
using namespace std;
int main() {
int a, b;
int temp;
int count = 0;
cin >> a;
temp = a;
while (true) {
b = (temp % 10) * 10 + (temp % 10 + temp / 10) % 10;
temp = b;
count++;
if (temp == a) {
break;
}
}
cout << count;
}
a는 입력받는 수이며 동시에 while문 안에서 계산된 식과 비교되는 숫자이다.
b는 계산한 수이며 계산 외에는 사용되지 않는다. b로 계산된 값은 temp에 전달해 a와 비교한다.
temp는 계산된 수이며 a와 비교하여 같다면 while문을 종료하고 불일치하다면 b를 통해 다시계산되어서 입력된다.
count는 사이클을 얼마나 반복했는가를 나타낸다. b가 계산될때마다 1씩 증가한다.
확실히 머리속으로만 구상하여 작성하려고 하는것 보다는 노트나 펜으로 적어가면서 코드를 짜는게 더 도움되는 것 같다.
'백준 > 단계별' 카테고리의 다른 글
[C++] 백준 5597 (0) | 2022.12.09 |
---|---|
[C++] 백준 2562 (0) | 2022.12.09 |
[C++] 백준 2438, 2439 (0) | 2022.12.08 |
[C++] 백준 10950 (0) | 2022.12.04 |
[C++] 백준 2048 (0) | 2022.12.04 |