방명록
- [알고리즘][파이썬] 백준_2231_분해합2021년 12월 03일 16시 59분 33초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
정수 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반응형'CS > 코딩 테스트' 카테고리의 다른 글
[알고리즘][파이썬] 백준_1018_체스판 다시 칠하기 (0) 2021.12.07 [알고리즘][파이썬] 백준_7568_덩치 (0) 2021.12.05 [알고리즘][파이썬] 백준_2798_블랙잭 (0) 2021.12.02 [알고리즘][파이썬] 백준_11729_하노이 탑 이동 순서 (0) 2021.11.30 [알고리즘][파이썬] 백준_2447번_별 찍기 - 10 (0) 2021.11.26 다음글이 없습니다.이전글이 없습니다.댓글