BJ 1110 - 더하기 사이클 문제 오답노트 / 풀이

Andy Hong·2024년 3월 21일

PS

목록 보기
1/4
post-thumbnail

사용한 언어 : C++ 17

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의 사이클의 길이를 구하는 프로그램을 작성하시오.


How I screwed up

#include <iostream>

using namespace std;

int x, y, sum, l;

void cycle(int k) {
    if (k < 10) {
        sum = k;
        l = 11 * k;
    } else {
        sum = k / 10 + k % 10;
        l = (k % 10) * 10 + sum % 10;
    }
    
}

int main() {
    int i = 1;
    int n;
    cin >> n;
    cycle(n);
    do {
        i++;
        cycle(l);
        if (n == l)
            break;
    } while (1);
    cout << i << endl;
    return 0;
}

처음에는 i의 초기값으로 1로 저장하고 cycle();을 실행한 뒤에, 실질적인 반복을 시작하는 방식으로 구현했다.

출력이 잘 나오다가 0을 넣었더니 어라?

2

1이 아니라 2가 나온다..

0의 경우 결과값 또한 0이 나오므로 한 번 사이클이 돈 것인데, 초기값을 1로 지정한 후에 반복을 하여 잘못된 결과가 나온 것이다!

How I Solved

사이클이 돈 횟수 i를 초기값 0으로 바꿨다.
그 후 입력값 n을 새로운 변수 k에 저장한 다음에, 반복문에서 k값을 활용하는 방식으로 코드를 수정했다.
n을 바로 사용하지 않은 이유는 nk값이 같을 경우, 반복문을 종료해야 하기 때문에, n의 초기값을 알아야 하기 때문이다.

#include <iostream>

using namespace std;

int x, y, sum, k;

int main() {
    int i = 0;
    int n;
    cin >> n;
    k = n;
    
    do {
        if (k < 10) {
            sum = k;
            k = 11 * k;
        } else {
            sum = k / 10 + k % 10;
            k = (k % 10) * 10 + sum % 10;
        }
        i++;
    } while (n != k);
    cout << i << endl;
    return 0;
}

이 경우, 입력된 값을 기준으로 반복을 시행하기 때문에, 0을 넣어도 정상적으로 출력한다.

1

작성하면서 하나 더 깨닫게 된 점은, 굳이 if문으로 10보다 작은 경우를 구분할 필요가 없었다는 점이다.

  1. 각 자리 수를 더하는 과정(통칭 A)을 제외하면 모든 과정은 맨 오른쪽 자리 수를 기준으로 하며
  2. 10보다 작은 경우, 즉 한 자리 수인 경우에는, 0을 더하기 때문에 과정 A 또한 문제가 되지 않는 것이다!

이에 do 문을 수정하면 다음과 같다.

do {
	sum = k / 10 + k % 10;
	k = (k % 10) * 10 + sum % 10;
	i++;
}

Problem Source

백준

profile
Soongsil Univ. Global Media 24

0개의 댓글