[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