알고리즘 :: 큰돌 :: Chapter1 - 기초 :: 백준 4375 1

Embedded June·2023년 6월 30일
0
post-thumbnail

문제

문제링크

해설

  • 어렵게 생각하면 한없이 어려워질 수 있는 문제입니다.
  • 우선 1, 11, 111 … 을 만드는 방법은 1부터 시작해서 10을 곱한 뒤 1을 더하면 됩니다.
  • 이 문제의 최대 난관은 ‘어떻게 자료형 오버플로우를 막을 것인가’입니다.
  • 주어지는 수는 2와 5의 배수가 아니기 때문에 어떻게든 배수 중 하나로 1로 이루어진 수를 가집니다. 그 수를 x라고 해봅시다.
    • x는 n의 배수이므로, x % n == 0입니다.
    • x % n == 0 이므로 (x % n) % n == 0 입니다.
    • x의 이전 규칙은 ((x / 10) - 1) 인데 이를 x’ 이라고 하면,
    • x % n == (x’ × 10 + 1) % n == ((x’ × 10 % n) + 1) % n 입니다.
  • 그러므로 오버플로를 걱정하면서 1, 11, 111, 1111을 계속 만들어가지 말고, n으로 나머지 연산을 하면서 나머지가 0이 나올 때까지 반복문을 반복하면 됩니다.
  • 저희는 해당 배수를 구하는 게 아니라, 배수의 자릿수가 궁금한 거니까요.

코드


#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int n;
    while (cin >> n) {
        int answer = 1;
        unsigned long long temp = 1;
        while (temp % n != 0) {
            temp = ((temp * 10) + 1) % n;
            answer++;
        }
        cout << answer << '\n';
    }
}

소스코드 링크

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글