PS/BOJ

[C] 백준 1110 : 더하기 사이클

소-은 2022. 5. 16. 16:00
728x90
1. 문제

 


2. 문제 이해

입력 : 26

2+6 = 8 -> 68

6+8 = 14 -> 84

8+4 = 12 -> 42

4+2 = 6 -> 26

출력 : 4

 

앞의 수의 1의 자리수가 다음 수의 10의 자리수가 되며,

앞의 자리 수 각각을 더한 값의 1의 자리수가 다음 수의 1의 자리가 된다. 


3. 접근

N의 10의 자리수와 1의 자리수를 더해 return 하는 방식으로 코드를 짰더니 8번이나 넘는 오답이 발생해 다시 보니  문제를 잘못 이해했었다.

 

 

#include <stdio.h>

int main() {
    int N, a, b, num, cnt=0;
    scanf_s("%d", &N);

    a = N / 10; // N의 10의 자리
    b = N % 10; // N의 1의 자리

    while(1) {
        num = 10 * b + (a + b) % 10; // (N의 10의 자리 수+1의 자리수)%10은 다음 N의 1의자리수, N의 1의 자리수 * 10= 다음 N의 10의 자리수
        cnt++;
        if (num == N) 
            break;
    }
    printf("%d", cnt+1);
}

문제를 바르게 이해한 후에 작성한 코드인데, visual studio 에서는 실행이 되더니, 백준 입력창에 넣으니 시간초과 오류가 발생했다.

 

#include <stdio.h>
int main() {
    int N, cnt=0;
    scanf_s("%d", &N);
    int init = N;
    while(1) {
        N = N % 10 * 10 + (N / 10 + N % 10) % 10 ; // (N의 10의 자리 수+1의 자리수)%10은 다음 N의 1의자리수, N의 1의 자리수 * 10= 다음 N의 10의 자리수
        cnt++;
        if (N == init) {
            printf("%d", cnt);
            break;
        }
    }
    return 0;
}

이렇게 작성했더니, 시간 초과 오류가 발생했다.

 


4. 최종 답안
#include <stdio.h>
int main() {
    int N, cnt=0;
    scanf_s("%d", &N);
    int init = N;

    while(1) {
        N = (N / 10 + N % 10) % 10 + N % 10 * 10; // (N의 10의 자리 수+1의 자리수)%10은 다음 N의 1의자리수, N의 1의 자리수 * 10= 다음 N의 10의 자리수
        cnt++;
        if (N == init) {
            printf("%d", cnt);
            break;
        }
    }
    return 0;
}
728x90