2231번: 분해합
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이
www.acmicpc.net
N = int(input())
# N의 생성자 M은 N보다 작거나 같다. (M <= N) 따라서 N의 생성자를 구할 때는 1~N 까지의 수의 생성자를 알아보면 된다.(1 <= M <= N 이므로)
# 매개변수가 생성자인 수를 리턴하는 함수
def d(num):
for cycle in str(num):
num += int(cycle)
return num
switch = 0
for check in range(1, N):
if d(check) == N:
print(check)
switch =1
break
if switch == 0:
print(0)
위 코드는 문제 풀이를 위해 처음 성공한 코드이고, 소스코드를 참고하여 아래 더욱 빠른 코드를 만들었습니다.
개선된 점
1. 생성자 M 찾는 시간 단축
2. 출력 간소화 (switch 제거)
해설
1. 생성자 M 찾는 시간 단축
따라서 N의 생성자는 N- (9 * n)부터 N-1 사이에 있다.
2. 출력 간소화 (switch 제거)
print를 if 문을 통해 두 개로 나눠 출력한 코드를 변수 값을 바꿔 한 개의 print문으로 출력하도록 변경하였다.
기존
조건에 따라 switch, check 둘 중 하나를 출력. ( 변수 두 개를 사용해 이해하기 복잡)
변경
→ switch, check의 값을 조건에 따라 M에 담은 후, M을 출력
N = int(input())
# M이 될 수 있는 최솟값
start_check = N - len(str(N)) * 9
if start_check < 0:
start_check = 0
# 매개변수가 생성자인 수를 리턴하는 함수
def d(num):
return num + sum(list(map(int,list(str(num)))))
M = 0
for check in range(start_check, N):
if d(check) == N:
M = check
break
print(M)
연관 문제로 4673번: 셀프 넘버가 있으니 같이 풀어보시면 좋을 것 같습니다.
4673번: 셀프 넘버
4673번: 셀프 넘버 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수
idealperson.tistory.com
오류, 개선점, 궁금한 점이 있으시다면 댓글로 남겨주세요. 감사합니다:)
'Algorithm > BAEKJOON - Python' 카테고리의 다른 글
2798: 블랙잭 (0) | 2022.12.28 |
---|---|
1015: 수열 정렬 - 문제 이해/해설 (0) | 2022.12.26 |
2525: 오븐 시계 (0) | 2022.12.25 |
4673번: 셀프 넘버 (2) | 2022.12.25 |