본문 바로가기
자료구조와 알고리즘/알고리즘

4375

by oncerun 2023. 7. 9.
반응형

 

문제 요약

 

2와 5로 나누어 떨어지지 않는 정수 n, 각 자릿수가 모두 1로만 이루어진 n의 배수를 찾아라.

 

출력

 

각 자릿수가 모두 1로만 이루어진 n의 배수 중 가장 작은 수의 자리수를 출력한다.

 

 

문제 풀이

 

뭔소리야?

 

배수는 어떤 수를 다른 수로 나누었을 때 나누어 떨어지는 수를 말한다. 

다른 말로는 한 수를 다른 수로 곱하여 얻어진 수를 해당 수의 배수라고 한다.

 

3, 6, 9는 뭐야? 3의 배수. 왜? 3,6,9라는 수를 3으로 나누었을 때 나누어 떨어지니까.

역으로 3 * 1 =3, 3 * 2= 6, 3*3=9, 얻어진 수는 3,6,9이고 이는 3의 배수.

 

이 개념으로 들어가면 

 

각 자릿수가 1로만 이루어진 경우는 다음과 같다.

1
11
111
1111
11111

 

이를 n으로 나눈 결과가 0인 경우 1xxxx는 n의 배수이다. 

 

주어진 N( 1<= n <= 100000)으로 자리수가 전부 1인 수가 n의 배수인 경우를 찾아야하는데, 생각을 해보자.

 

각 자리의 수가 1인 수를 각 자리를 추가 반복하면서 나누어 떨어지는지 확인해서 결과를 주면된다. 

 

근데 걱정해야하는 부분이 있는데, n이 9901인 경우 각 자리수가 1인 12자리가 발생한다. 

12자리면 100,000,000,000  천억인데, long long 타입으로 가져가도 될 것 같다. 최대 19자리의 정수를 나타낼 수 있다.

만약 부호없는 정수로 표현하면 1자리 더쓸 수 있다.

 

 

응 ~ 시간초과~

#include <bits/stdc++.h>

using namespace std;

int n;
typedef unsigned long long ll;

int main() {

    while(scanf("%d", &n) != EOF){
        ll cnt = 1, ret = 1;
        while(true){
            if(cnt % n == 0) {
                printf("%lld\n", ret);
                break;
            }else{
                cnt = (cnt * 10) + 1;
                ret++;
            }
        }
    }

    return 0;
}

 

모듈로 연산하면 된다. 

#include <iostream>
#include <string>

using namespace std;

typedef unsigned long long ll;

int main() {
    int n;
    while (cin >> n) {
        ll number = 1;
        int digitCount = 1;
        while (number % n != 0) {
            number = (number * 10 + 1) % n;
            digitCount++;
        }
        cout << digitCount << endl;
    }

    return 0;
}

 

반응형

'자료구조와 알고리즘 > 알고리즘' 카테고리의 다른 글

1629  (0) 2023.07.09
3986  (0) 2023.07.09
1940  (0) 2023.07.09
1213  (0) 2023.07.09
9375  (0) 2023.07.08

댓글