개발자가 내팔자

[BOJ] 백준 2231 분해합 python 본문

Algorithms

[BOJ] 백준 2231 분해합 python

야생의 개발자 2022. 5. 19. 19:46

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

 

문제 읽으면서 뭔 개소리야... 라고 생각했다.

무슨 특별한 공식 같은 게 있을거라 생각하고 계속 문제를 노려보면서 생각했는데,

시간 제한이 2초라는 것을 보고 그냥 반복문을 돌려야겠다고 생각했다.

그래도 파이썬은 느리니까 범위를 좀 지정해주었다.

 

코드는 아래와 같다.

number = input()

place = len(number)

number = int(number)


if number > place * 9:
	min_num = number -  place * 9
else:
	min_num = 1

def solution(number):
	for num in range(min_num, number):
		answer = num
		result = num
		while num > 0:
			result += num % 10
			num //= 10
		if result == number:
			return answer
	return 0

print(solution(number))

min_num은 범위를 좁히기 위한 처치인데, 10진수 정수의 각 자리수의 최댓값인 9가 오는 것으로 잡았다.

만약 333이 온다면 3 * 9 = 27을 뺀 306부터 검사한다. 0부터 검사하는 건 불필요하기 때문이다.

사실 이보다 더 좋은 풀이가 있을 것 같지만 귀찮아서 다음에 알아보기로 한다.

 

Comments