백준 1110번

CharliePark·2020년 9월 18일
0

TIL

목록 보기
40/67

BOJ 1110 : 더하기 사이클

사실 그렇게까지 어려운 문제는 아니라고 할 수 있겠다.

변수 갯수 상관없이 문제를 풀면 각 자리수를 변수에 담아서

다시 계산을 해서 원래 입력값과 비교하면 별 문제가 없다.

다만 그 해법의 경우 문제를 제대로 풀기 전에 떠올라서, 변수를 좀 적게 써서 수식 형태로 처리하고픈 생각이 있었다.

몇 차례 시도했으나 수식으로 압축하다보니 시간 초과가 나는 경우가 몇 있었고..


#include <stdio.h>

int main()
{
    int num, num_check;
    int count = 0;
    scanf("%d", &num);
    num_check = num;
    
    while (1)
    {
        int temp = (num_check*11)%100;
        num_check = (temp%10)*10 + (temp/10);
        count++;
        
        if(num_check==num)
            break;
    }
    printf("%d", count);
}

이 코드의 수식이 시간 내에 통과되었다.

원래는 이런 방식으로 생각했는데

일의 자리는 원래 숫자의 (일의자리 + 십의자리) 한 것의 일의 자리

십의 자리는 원래 숫자의 일의자리 이므로

여기서 볼수 있듯이 원래 숫자에서 다음 숫자로 넘어갈 때 (일의자리 + 십의자리) 가 10을 넘지 않으면

일의 자리는 곱하기 11이되고

십의 자리는 나누기 10이된다

그러나 10을 넘으면 일의 자리만 사용해야하므로..

골치아파진다

그래서 다른 방식으로 접근했다.

수식을 통해서 원래 숫자의 (일의 자리+십의 자리) 의 일의 자리 를 얻을 수 있을까?

얻을 수 있다!

원래 숫자를 곱하기 11하면, 그 숫자의 십의 자리는 (일의 자리 + 십의 자리) 일의 자리이다

(합이 10이 넘었을 때 백의 자리로 숫자가 넘어가므로)

또한 이 숫자의 일의 자리는 원래의 일의 자리 그대로이다.

즉 이 숫자의 십의 자리와 일의 자리를 맞바꾸면

구하고자 하는 수가 된다.

이에서 착안해 위의 해법을 찾았다.

근데..

그냥 간단하게 풀 수 있으면 그것대로도 좋다 ..

0개의 댓글