Dandy Now!
  • [알고리즘][파이썬] 백준_2231_분해합
    2021년 12월 03일 16시 59분 33초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    정수 N이 주어졌을때,

    그 정수의 생성자 M을 출력해야 한다.

    정수 N은 생성자 M을 이용해 만들어진 숫자다.

    공식은 다음과 같다. 

    N = M + M의 각 자리 수의 합
    예) 216 = 198 + (1 + 9 + 8)

     

    사용한 함수, 변수 명

    N : 입력값
    M : 생성자
    n : 입력값 매개변수
    cons : 생성자 함수(constructor)
    div : M의 각 자리 수의 합(division)
    decom : 분해합(decompose)
    rst : 출력값(result)

     


    1차 시도

    # None 미처리(결과: 틀렸습니다)
    
    def cons(n):
        for M in range(1, n+1):
            div = sum(list(map(int, str(M))))
            decom = M + div
            if decom == n:
                return M
    
    N = int(input())
    print(cons(N))

     

    예제 입력의 216 입력 시 198로 제대로 출력 되었으나,

    198 입력 시 0이 아니라 None이 출력 되었다.

    이 문제를 해결 해야 했다.


    2차 시도

    # None이 0으로 출력되도록 처리함(결과: 맞았습니다!)
    
    def cons(n):
        rst = 0
        for M in range(1, n+1):
            div = sum(list(map(int, str(M))))
            decom = M + div
            if decom == n:
                rst = M
                break
        if rst is None:
            return 0
        else:
            return rst
    
    N = int(input())
    print(cons(N))

     

    198 입력 시 0이 제대로 출력 되었다.

    결과도 "맞았습니다!"

    하지만 코드를 좀 더 다듬을 수 있겠다는 생각을 했다.


    3차 시도

    # 리팩토링 후 제출(결과: 맞았습니다)
    
    def cons(n):
        rst = 0
        for M in range(1, n+1):
            div = sum(map(int, str(M)))
            decom = M + div
            if decom == n:
                rst = M
                break
        return rst
    
    N = int(input())
    print(cons(N))

     

    첫 번째 수정,

    rst 변수 선언 시 0을 대입하였기 때문에 for문의 결과가 없다면(None이라면),

    rst 값은 변경되지 않기 때문에 2차 시도에서 작성한 아래의 코드는 없어도 된다.

    if rst is None:
        return 0

     

    두 번째 수정,

    div = sum(list(map(int, str(M))))

    위 코드에서 list로 변환하는 과정이 불필요하기 때문에 다음과 같이 수정했다.

    div = sum(map(int, str(M)))

    해결한 방법

    1부터 입력 받은 숫자까지 반복문을 돌리되,

    분해합(M+(M의 각자리수의 합))이 입력 받은 수와 같을 때

    M을 출력하였다.

    해당하는 경우가 없을 때(None)에는 변수 rst의 기본 값인 0이 리턴되도록 하였다.

    M의 각자리수의 합은

    먼저 정수를 문자열로 바꾸고,

    str(M)

     

    문자열의 각 자리의 문자를 다시 정수로 바꾼 뒤,

    map(int, str(M))

     

    sum 함수를 이용해 각 자리의 수를 합하였다.

    sum(map(int, str(M)))
    728x90
    반응형
    댓글