'생성자가 없는 셀프 함수를 찾아라'가 문제였기 때문에, 1부터 10000까지 숫자 중 생성자가 있는 수를 찾아서 중복을 허용하지 않는 set 자료형에 넣어두고, 다시 반복문을 돌리며 1부터 10000까지 숫자 중 해당 set에 포함되지 않은 숫자를 찾는 방법으로 풀었다.
평소라면 자리수를 세기 위해 파이썬 내장 함수 str()을 이용해 숫자를 문자로 바꿔서 했을 테지만, 왠지 수학으로 접근해서 푸는 방법이 있을 것 같아 찾아보다가 좋은 방법을 알아냈다. 바로 로그10을 이용해 소수점을 버림해서 자리수를 알아내는 것이다. (참고: https://shoark7.github.io/programming/algorithm/3-ways-to-get-length-of-natural-number)
이렇게 하면 문자형으로 바꾸는 함수가 없는 언어에서도 자리수를 구할 수 있다.
그런데 log10을 쓰다가 ValueError: math domain error이 일어났는데, 이건 확인해보니 내가 반복문의 첫 시작을 1이 아니라 0부터 시작했기 때문에 에러가 난 것이었다. log(0)은 정의될 수 없기 때문이다.
# 4673 셀프 넘버
# 함수 d를 정의해서 문제를 풀라 했으니, 우선 수열을 만들 수 있는 함수 d를 생성한다.
# 문자열로 자리수를 구해서 풀 수도 있지만, 조금 더 어렵게 풀어보기 위해 로그를 이용해 자리수를 알아내는 방식을 사용해봤다.
# 그랬더니 ValueError: math domain error가 일어난다. 확인해보니 반복문을 1이 아니라 0부터 시작하게 설정해놨었다.
# log(0)은 정의될 수 없으므로 오류가 난다.
import math
def d(n):
result = n
log_num = math.log10(n)
zero_numbers = math.trunc(log_num)
while n > 0:
result += n // (10 ** zero_numbers)
n %= (10 ** zero_numbers)
zero_numbers -= 1
return result
# d의 result가 될 수 없는 셀프 넘버를 구하는 방법을 나는 이렇게 했다.
# d 함수에 1부터 10000까지를 다 넣어서, 결과값을 set으로 만들고,
# 1부터 10000까지의 수 중 그 안에 없는 수를 찾는다.
results = set()
for i in range(1, 10000):
results.add(d(i))
for i in range(1, 10000):
if i not in results:
print(i)
'개발 공부 > 알고리즘 문제풀이' 카테고리의 다른 글
[백준] 11654. 아스키 코드 (0) | 2022.07.18 |
---|---|
[백준] 1065. 한수 (0) | 2022.07.18 |
[백준] 15596. 정수 n개의 합 (0) | 2022.07.18 |
[백준] 4344. 평균은 넘겠지 (0) | 2022.07.18 |
[백준] 8958. OX퀴즈 (0) | 2022.07.17 |