[Python] 코딩 도장 - Ones

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: Ones] - Lv.2

2나 5로 나눌 수 없는 0 이상 10,000 이하의 정수 n이 주어졌는데,

n의 배수 중에는 10진수로 표기했을 때 모든 자리 숫자가 1인 것이 있다.

그러한 n의 배수 중에서 가장 작은 것은 몇 자리 수일까?

Sample Input

3
7
9901

Sample Output

3
6
12

출처: https://codingdojang.com/scode/431?answer_mode=hide


[풀이]

def Ones(n):
    i = 2
    while n:
        x = sum([10**j for j in range(i)])
        if x % n == 0:
            print(i)
            n = 0
        i += 1
        
Ones(9901)
12

모든 자리 숫자가 1인 숫자는 다음과 같이 표현 가능하다.

10^0 + 10^1 + 10^2 …

이런 숫자의 자릿 수는 마지막 지수 +1로 나타나므로 지수를 증가시키며 n으로 나눠지는지 확인하였다.

range()가 마지막 숫자는 포함하지 않기에 위와 같이 i를 바로 출력시키면 된다.

그리고 코드 상 sum() 부분이 사실 등비수열 합이므로 $\dfrac{a (r^n - 1)}{r - 1}$ 공식을 사용해도 된다.


[추천 풀이]

def One (n,m=1,k=0,l=0):
    k += m % n
    l += 1
    if k%n == 0: print(l)
    else:One(n,m*10,k,l)

One(9901)
12

이 분 코드에서 k는 n으로 10^0, 10^1, 10^2, …을 나누었을 때 나머지를 모두 합한 값이다.

k가 n의 배수가 된다면 전체 숫자의 나머지가 없으므로 전체 숫자는 n의 배수가 된다.

아이디어가 기발하신 것 같다.

10의 아닌 다른 숫자로 적용해도 가능하다는 점과 재귀 방식을 쓴 것도 인상적이다.

def a(n):
    b = '1'
    while int(b) % n != 0: b += '1'
    return len(b)

a(9901)
12

또 다른 풀이인데 문자열 형태로 바꿔주어서 1을 계속 붙혀주는 방식으로 간편하게 풀었다.

Leave a comment