728x90
728x90
문제
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.
출력
첫째 줄에 N의 사이클 길이를 출력한다.
예제 입력 1
26
예제 출력 1
4
예제 입력 2
55
예제 출력 2
3
예제 입력 3
1
예제 출력 3
60
예제 입력 4
0
예제 출력 4
1
예제 입력 5
71
예제 출력 5
12
출처
- 문제를 번역한 사람: baekjoon
- 어색한 표현을 찾은 사람: doju
- 문제의 오타를 찾은 사람: eric00513
- 데이터를 추가한 사람: jh05013
알고리즘 분류
- 수학
- 구현
문제 출처
https://www.acmicpc.net/problem/1110
문제 해결 방법
- 문제 해결의 규칙을 파악한 후, 문제를 해결하였다.
- 입력받는 N의 값은 한 자리 또는 두 자리 수이며, 첫 번째로 십의 자리 숫자와 일의 자리 숫자를 더해준다.
- N = digit10 + digit1
- 그 뒤로 10 미만인 경우와 10 이상인 경우로 나누어 계산을 다르게 수행한다.
- 10 미만인 경우
- N = (10 * digit1) + N
- 10 이상인 경우
- N = (10 * digit1) + (N % 10)
- 10 미만인 경우
- 이 과정이 한 번씩 수행될 때마다 cycle 의 값을 1씩 증가시켜 준다.
- 이 과정을 반복해서 나온 수가 원래 입력 받은 N 값과 비슷할 경우, 무한 루프에서 빠져나온 후 cycle의 값을 출력시킨다.
- 입력받는 N의 값은 한 자리 또는 두 자리 수이며, 첫 번째로 십의 자리 숫자와 일의 자리 숫자를 더해준다.
코드
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
int N, originN, digit10, digit1, cycle;
cin >> N;
cycle = 0;
originN = N;
while (1) {
digit10 = N / 10;
digit1 = N % 10;
N = digit10 + digit1;
if (N < 10) {
N = (10 * digit1) + N;
}
else {
N = (10 * digit1) + (N % 10);
}
cycle++;
if (N == originN) {
break;
}
}
cout << cycle << '\n';
return 0;
}
채점 결과
참고
- [단계별로 풀어보기] > [반복문]
728x90
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ-3052][C++] 나머지 (0) | 2022.07.10 |
---|---|
[BOJ-2577][C++] 숫자의 개수 (0) | 2022.07.10 |
[BOJ-2562][C++] 최댓값 (0) | 2022.07.10 |
[BOJ-10818][C++] 최소, 최대 (0) | 2022.07.10 |
[BOJ-10951][C++] A+B - 4 (0) | 2022.07.09 |
[BOJ-10952][C++] A+B - 5 (0) | 2022.07.09 |
[BOJ-10871][C++] X보다 작은 수 (0) | 2022.07.09 |
[BOJ-2439][C++] 별 찍기 - 2 (0) | 2022.07.09 |