[알고리즘] 백준 1110번 : 더하기 사이클
https://www.acmicpc.net/problem/1110
문제
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의 사이클의 길이를 구하는 프로그램을 작성하시오.
문제를 읽자마자 글씨가 튕겨나가는 매직 ~
그래도 어쩌겠어,, 해야지요,,,
#include <iostream>
using namespace std;
문제 이해하는 것보다 빨리하는 첫 줄 코드 쓰기 (우다다다ㅏ다다다닫)
이거 쓰고 문제 다시 읽기 시이작..
먼저 주어진 수가 10보다 작으면?? 보자마자 일단 if(n<10) 적어만 놓기 ~ 앞에 0을 붙여 두자리 수로 만든다 ? 그럼 이걸로 사이클 수 +1 이미 됨!
나머지는 방법 동일하게 진행 ↓
주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙여서 새로운 수 만듦
== 이 말 뜻은 26에서의 6은 새로운 수의 십의 자리, 각 자리 수 합한(2+6) 8은 새로운 수의 일의 자리 → 68 새로운 수 완성
이 방법을 할 때마다 사이클 수 +1
#include <iostream>
using namespace std;
int main(){
int n,x;
int sum;
sum = 1;
cin >> n;
x=n;
if(n<10){
sum += 1;
x = n*10 + (n*2)%10;
}
else{
x = (n%10)*10+(n%10+n/10)%10;
}
while(x!=n){
x = (x%10)*10+(x%10+x/10)%10;
sum ++;
}
cout << sum ;
return 0;
}
이렇게 하자마자 제출하니깐 틀렸습니다..?
예제 입력을 다시 해보니, 0을 입력하면 사이클 수가 1이 아니라 2가 나오는 걸 확인함 !
그래서 if (n==0)을 추가하여 새로운 조건 만들어서 재제출!
#include <iostream>
using namespace std;
int main(){
int n,x;
int sum;
sum = 1;
cin >> n;
x=n;
if(n==0){
x = n;
}
else if(n<10){
sum += 1;
x = n*10 + (n*2)%10;
}
else{
x = (n%10)*10+(n%10+n/10)%10;
}
while(x!=n){
x = (x%10)*10+(x%10+x/10)%10;
sum ++;
}
cout << sum ;
return 0;
}
보기만 해도 좋은 "맞았습니다!!"