📝 문제
https://www.acmicpc.net/problem/4673
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
🎨 풀이
💡 성공 코드
arr = []
def selfnumber(num):
n = num
while (n < 10000):
tmp = sum(list(map(int,str(n))))
n = n + tmp
if n in arr :
return 0
else : arr.append(n)
return 0
def main():
for num in range(1,10000):
if num in arr:
continue
selfnumber(num)
if num not in arr :
print(num)
main()
> 코드 길지만 은근 쉽다. (실행 순서에 따라 작성했습니다)
1. arr을 전역변수로 선언한다.
2. main을 실행시킨다.
< main >
3. 1부터 10000까지 for문을 돌린다.
---------------- for문 ------------------
4. 만약 그 숫자가 arr에 이미 있다면 continue 시킨다.
- 최대한 시간 줄이기 위해 노력한 부분1 (쓸데없는 반복 줄임)
5. 그렇지 않다면 selfnumber 함수에 그 수를 넣어준다.
<selfnumber>
6. 일단 전달받은 숫자를 n에 넣어둔다.
----------------- while문 ------------------
7. n을 한글자씩 나눠서 list에 나눠담은 후, 합계를 구해서 tmp에 넣는다. (int 형태) ex) n = 13 => [1,3] => tmp = 4
8. n += tmp 를 해준다.
9. 만약 n이 arr에 이미 있다면 이 selfnumber 함수를 return 해준다. (끝낸다)
- 이미 n이 있다는 건 앞으로 돌 while 문이 쓸모없다는 뜻임. 왜냐면 같은 작업을 반복할거니까!! 다 이미 했던 거 굳이 안하게 중간에서 끊어주는 것임.
10. n이 arr에 없다면 arr에 넣어주고 다시 while문을 돈다.
----------------- while문 끝------------------
11. arr에 없는 숫자라면 print 해준다.
---------------- for문 끝------------------
😣 실패 코드
arr = []
def selfnumber(num):
if num in arr:
return 0
else :
n = num
while (n < 10000):
tmp = sum(list(map(int,str(n))))
n = n + tmp
arr.append(n)
return 0
def main():
for num in range(1,10000):
selfnumber(num)
for i in range(1,10000):
if i not in arr :
print(i)
main()
> 시간 초과. 문제는 main에 for문이 두개라서 아무래도 시간이 느려지는 것 같아서 두 번째 for문을 지웠다. 슬쩍 첫번째랑 결합시켰다. 하지만 결과는 밑의 코드와 같다 ^_^
arr = []
def selfnumber(num):
n = num
while (n < 10000):
tmp = sum(list(map(int,str(n))))
n = n + tmp
arr.append(n)
return 0
def main():
for num in range(1,10000):
if num in arr:
continue
selfnumber(num)
if num not in arr :
print(num)
main()
> 시간초과. selfnumber에 이 숫자가 arr에 있는지 체크하는 부분을 main으로 옮김 & 두 번째 for문 삭제했는데 또.. 시간초과가 떴다. 이후에는 성공코드처럼 while문 중간중간 체크 해주니까 잘 통과가 되었다~

끝~
⭐ 느낀점
> 살짝 오늘 못풀수도 있겠다는 생각이 들었는데, 통과하니까 기분이 너무 좋았다 ㅎ_ㅎ 잘했다~
'🎲 알고리즘 공부 > 백준' 카테고리의 다른 글
[백준] 11654번 - 아스키 코드 (파이썬) (0) | 2022.06.12 |
---|---|
[백준] 1065번 - 한수 (파이썬) (0) | 2022.06.11 |
[백준] 15596번 - 정수 N개의 합 (파이썬) (0) | 2022.06.09 |
[백준] 4344번 - 평균은 넘겠지 (파이썬) (0) | 2022.06.08 |
[백준] 8958번 - OX퀴즈 (파이썬) (0) | 2022.06.07 |