문제 링크
난이도 : 실버 3

문제 내용

2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 각 자릿수가 모두 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다.

출력

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

문제 분석

문자열 “1”에다가 뒤에 하나씩 1 붙이면 되지 않을까?

작성한 코드

#include <bits/stdc++.h>
 
using namespace std;
 
int main(){
    int n;
    string s = "1";
    for(;scanf("%d", &n);printf("%s", s)){
        while(true){
            if(stoi(s)%n!=0) s += '1';
            else break;
        }
    }
}

결과 : 개 큰 오류.. out of range 뜸.

찾아보니 stoi()가 문제였음

int 범위가 최대 10자리임

근데 예시 input/output에서도 보면 알겠지만 12자리 이상도 충분히 나올 수 있음 (이 생각을 못함..)

그래서 다른 방법을 써야하는 듯

아래는 deepseek가 써줌

#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int num = 1;  // 1로 시작
        int length = 1;  // 숫자의 길이
        while (true) {
            if (num % n == 0) {  // n으로 나누어 떨어지는지 확인
                printf("%d\\n", length);
                break;
            }
            num = (num * 10 + 1) % n;  // 다음 숫자로 업데이트
            length++;
        }
    }
    return 0;
}

우수 코드 분석

#include <cstdio>
 
void solveCase (int N) {
  int k=1;
  int cnt=1;
  k %= N;
  while (k) {
    cnt++;
    k = (k*10 + 1) % N;
  }
  printf("%d\\n", cnt);
}
 
int main ()
{
  int N;
  while (scanf("%d", &N) > 0) {
    solveCase(N);
  }
  return 0;
}

똑같은 방식으로 진행하심

k % n == 0이면 멈추니까 while(k)로 하신듯