상세 컨텐츠

본문 제목

[알고리즘] 백준 1110번 : 더하기 사이클

알고리즘

by 녕녕펀치 2024. 8. 6. 19:52

본문

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;
}

 

보기만 해도 좋은 "맞았습니다!!"

'알고리즘' 카테고리의 다른 글

[알고리즘] 백준 3052 : 나머지  (0) 2024.08.06

관련글 더보기