# 본인 풀이
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll square(ll mult){
if(mult == 0){
return 1;
}
if(mult == 1){
return 10;
}
// 홀수제곱
if(mult % 2){
return 10 * square(mult / 2) * square(mult / 2);
}else{
return square(mult / 2) * square(mult / 2);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
ll count = 0;
ll num;
cin >> num;
// 시간초과
while (1){
ll ret = 0;
for (ll i = 0; i <= count; i++){
ret += square(i); // square(0) + square(1) + square(2) => 1 + 10 + 100
}
count++;
if (ret % num == 0)
{
break;
}
}
cout << count << "\n";
return 0;
}
- 시간초과 났음
- 10의 제곱을 출력해주는 함수를 생성했음 -
nlogn
시간 (제곱함수 재귀호출에logn
, count변수 n번까지하여 111...11 수를 만들어야 해서 n) - 애초에 시간복잡도 문제가 아닌,
long long
타입 오버플로우 문제였음.
# 모범 답안
로직은 어느정도 맞다고 할수 있으나, 최대범위를 벗어난 데이터 내에서 while
무한루프가 발생하여 시간초과가 발생하는 것이었다. 정수론 모듈로 연산을 적용해야 한다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
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)) % n + (1) % n;
// 엄밀히 따지면, (cnt % n * 10 % n) + 1임
ret++;
}
}
}
return 0;
}
입력값이 무한대로 주어지기 때문에 while(scanf("%d", &n) != EOF)
로 시작해야 한다. 나머지는 정수론의 모듈로 연산에 입각하여 로직을 구성한다.