[Algorithm] 4375-1

gunggme·2023년 11월 23일

알고리즘

목록 보기
20/42

시작

이 문제는 전에 풀었던 문제와 비슷하게 접근을 시작하면 된다. 이 문제는 2와 5로 나눠지지 않는 수인 n을 입력을 받고 1이 n개의 수가 나눠지는 수를 구하면 된다. 3을 입력을 받으면 111이라는 값을 가지게 되는데. 이 값을 0으로 나눠떨어지는 수인 3을 출력을 하면 되고, 7을 입력받으면 1,111,111를 가지게 되는데, 이 값이 0으로 떨어지는 수를 구하면 되는 것이다. 하지만 예제 입력에는 9901이라는 수를 입력 받게 되는데, 9901은 1이 9901개라는 수를 가지게 되며, 이 수는 long long을 넘게 되는 수를 가지게 된다.

접근 법

그렇다면 어떻게 오버플로우를 방지하는 방법이 있느냐, 그 방법은 num = (num * 10) + 1을 하게 되면, 1, 11, 111, 1111..을 만들 수 있는데, 이 것을 하는 동시에 바로 입력받은 n을 나눠주면 해결 된다는 것을 알 수 있다.

코드

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>

using namespace std;


int main() {
	int n;
	unsigned long long int num = 1;
	unsigned long long int result = 0;
	while (cin >> n) {
		num = 1; result = 1;
		while (true) {
			// 만약 0으로 나눠질때
			if (num % n == 0) {
				cout << result << "\n";
				break;
			}
			// 만약 안나눠 지면
			else {
				// 1 * 10 + 1 => 11
				num = (num * 10) + 1;
				// n씩 나눠주면서 overflow안나게 만들기
				num %= n;
				result++;
			}
		}
	}
}
profile
안녕하세요!

0개의 댓글