For Programmer
백준 4673번 파이썬 문제풀이(함수:셀프넘버) 본문
728x90
나의 코드
array = [False] * 10036 #9999 일때의 경우의 수를 고려해 10036까지 배열 설정
def solve():
for i in range(1, 10001):
if i < 10: #한자리수일때
array[i + i] = True #각자리수의 합+전체수를 True로 변경
elif i < 100: #두자리 수일때
array[i + (i // 10) + (i % 10)] = True #각자리수의 합+전체수를 True로 변경
elif i < 1000: #세자리 수일때
array[i + (i // 100) + (i % 100 // 10) + (i % 100 % 10)] = True #각자리수의 합+전체수를 True로 변경
elif i < 10000: #네자리 수일때
array[i + (i // 1000) + (i % 1000 // 100) + (i % 1000 % 100 // 10) + (i % 1000 % 100 % 10)] = True #각자리수의 합+전체수를 True로 변경
for i in range(1, 10001):
if array[i] == False: #True가 아닌것들은 생성자가 없는 수들이기 때문에 False만 출력
print(i)
solve()
좋은코드
def d(n) -> int:
temp = 0 # 각자리수를 더하기 위한 변수 생성
for x in list(
str(n)): # 숫자나 문자를 String 형식으로 list에 담을 경우 각각의 자리수(각각의문자)가 원소로 담김 ex:"abc" -> "a","b","c" ,"123" -> "1","2","3"
temp = temp + int(x) # 각자리수를 더해주어 a에 대입
return n + temp # 전체수와 각자리수를 더함
array = []
for i in range(1, 10001):
k = d(i) # 각자리수+전체수를 더하는 함수를 호출하여 k에 대입
array.append(k) # k값을 array리스트에 삽입(생성자가 있는 값들만 삽입)
for b in range(1, 10001):
if b in array: # array리스트에 b값이 있으면 넘김
pass # 아무것도 안한다.
else: #없는것들 즉, 생성자가 없는 숫자만 출력
print(b) # b값 출력
더 최적화한 코드
list_ = [] # 빈 리스트 선언
for i in range(1, 10001): # 1부터 ~ 10000까지 돌기
a = i # a라는 변수에 i 값 대입
for j in str(i): # i를 문자열로 바꾸어 각각의 자리수에 접근
a += int(j) # 문자열로 바꾼 i를 다시 int형으로 바꾸어 a에 더해준다.
list_.append(a) # 그 값을 list에 추가
if i not in list_: # 만약 리스트에 i 값이 없다면
print(i) # 그 값은 셀프넘버이므로 출력
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 11654번 파이썬 문제풀이(문자열 - 아스키코드) (0) | 2021.09.03 |
---|---|
백준 1065번 파이썬 문제풀이(함수 - 한수) : 점화식으로 풀어보기 (0) | 2021.09.01 |
백준 10818번 파이썬 문제풀이(1차원 배열) - 백분율 출력 (0) | 2021.08.30 |
백준 4344번 파이썬 문제풀이(1차원 배열) (0) | 2021.08.30 |
백준 2577번 파이썬 문제풀이(1차원 배열) (0) | 2021.08.30 |
Comments