킵고잉

백준 알고리즘 1110번: 더하기 사이클 본문

백준 알고리즘

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

여의도비 2018. 8. 27. 23:53

고민고민하다가 드디어 더하기 사이클을 풀어냈다. 이거를 근데 if문 사용하라는 건데 내가 푼 방식으로는 if가 전혀 들어가지도 않으며 상당히 간단하다! 내가 생각한대로 움직이긴 하지만 다른 사람들과 조금 달라서 다른 사람들은 왜 그렇게 풀었는지 아직 초보라 조금은 가독이 되지 않는다. 


일단 문제 나가시겠다.


시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB29890141011209248.248%

문제

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

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력

첫째 줄에 N의 사이클 길이를 출력한다.

예제 입력 1 

26

예제 출력 1 

4






















































음 처음에 문제를 풀면서 이거를 0~10사이의 숫자랑 그 위의 숫자랑 구분해서 계산해야한다는 생각이 들었고 거기에 if 문이 들어가지 않을까 싶었다. 그런데 내가 생각한 연산식을 이용하면 굳이! if 문을 사용할 필요가 없었다. 

일단 먼저 소스코드 부터!




#include <stdio.h>

using namespace std;


int main() {

int a = 0, b = 0, count = 0, num = -1;

scanf("%d", &a);

b = a;


for(count = 0; num != a; count++  ){

num = (b % 10) * 10 + (b / 10 + b % 10) % 10;

        기존 숫자의 1자리 숫자      10의자리     1의자리


b = num;

}

printf("%d", count);

}


생각보다 간단하지 않나 ? 일단 num = ~ 부분을 보면서 이야기를 하면 


(b / 10 + b % 10) / 10 은 1의 자리수를 나타낸다. 일단 10미만 숫자를 생각해보자. 문제에서 10보다 작은 한 자리 숫자에는 앞에 0을 끼워서 연산 하라고 했다. 그러면 

1로 예시를 들면 


1 -> 01 - > 0+1 = 1 -> 11 이된다. 위의 연산식을 이용하면 b/ 10에서는 당연히 10보다 작으니 1은 나머지 처리 되면서 0으로 계산되고 b % 10을 하면 못나눠서 나머지로 빠져버리니 1이 나오지 않겠는가 ? 그래서 한 자리 숫자도 자연스럽게 0이 있는것처럼 여겨져서 계산된거나 다름 없게 되는 것이다. 그러니 이렇게 if 문 없이 간단하게 처리가 가능했다! 오늘 3개나 포스팅해버렸다. 기분이 좋다 군생활 빨리 갔으면 .... !!










Comments