1 분 소요

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 128 MB 8029 2705 2105 33.810%

문제

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

입력

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

출력

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

예제 입력 1

3
7
9901

예제 출력 1

3
6
12

알고리즘 분류

문제 풀이

풀이 과정

문제 자체를 이해하는데 시간이 조금 오래걸렸지만 문제를 이해하고 푸는 것까지는 쉬웠다.

2와 5로 나누어 떨어지지 않는 정수를 입력하였을 때 그 정수의 배수 중에서 1로만 구성된 숫자 중 최솟값을 찾는 문제였다.

여기서 1로만 구성된 숫자란 (1, 11, 111, 1111,….) 와 같은 숫자들을 말하는 것이다.

아래 코드를 보면 알겠지만 첫 번째 풀이 코드는 런타임에러(EOFError) 가 발생하였다. 직접 테스트 케이스를 넣어본 결과 모두 잘 나오는 것을 확인했음에도 저런 에러가 발생한 것은 이번이 처음이라 조금 당황했던 것 같다.

검색을 통해 알아보니 이 문제는 입력 갯수가 주어지지 않았기 때문에 while, try를 사용하여 python의 EOF를 처리해 주어야 하는 것이었다.

제출 코드: 실패

def sol(n):
    
    one = 1
    idx = 1
    while True:
        if one % n == 0:
            a = list(str(one))
            return len(a)

        else:
            one += 10*idx
            idx *= 10
            
while True:
    n = int(input())
    print(sol(n))

1, 11, 111, 1111 과 같은 패턴을 만들면서 입력 받은 정수와 modulo 연산을 통해 0이 나오면 n의 배수인 점을 활용하여 코드를 짰다.

제출 코드: 성공1


while True:
    try:
        n = int(input())

        one = 1
        idx = 1
        while True:
            if one % n == 0:
                a = list(str(one))
                print(len(a))
                break

            else:
                one += 10*idx
                idx *= 10

    except EOFError:
        break

제출 코드: 성공2

while True:
    try:
        n = int(input())

    except EOFError:
        break

    one = 1
    idx = 1
    while True:
        if one % n == 0:
            a = list(str(one))
            print(len(a))
            break

        else:
            one += 10*idx
            idx *= 10    

사실 의미는 없지만 try-except 구문을 위 두 가지 방법으로 모두 해 보았고 그 결과 1번 방법이 더 시간이 짧은 것을 확인 할 수 있었다.

image

댓글남기기