For Programmer

백준 4673번 파이썬 문제풀이(함수:셀프넘버) 본문

코팅테스트/백준 문제 모음

백준 4673번 파이썬 문제풀이(함수:셀프넘버)

유지광이 2021. 9. 1. 14:04
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
Comments