-
[백준] 2231번_분해합Study/알고리즘 2020. 1. 28. 12:17
문제 링크 : https://www.acmicpc.net/problem/2231
2231번: 분해합
문제 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다. 자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그
www.acmicpc.net
# string으로 처리 def decom(k): deN = [] for i in range(len(k)): deN.append(k[i]) sum_ = int(k) for i in deN: sum_ += int(i) return sum_ n = int(input()) pro = n//2 while True: constructor = decom(str(pro)) if constructor == n: print(pro) break elif constructor > n: print(0) break else: pro+=1
일단 초반에 풀 때, 한자리수씩 떼어내는 게 생각이 안나서 함수를 하나 만들었고, constructor가 n보다 크면 0을 출력하고 끝내게 했다.
당연하게도 틀린 이유는 그 뒤에 나올 숫자의 분해합이 더 작아질 수도 있다는 것이다.
예를 들어, 209의 분해합은 220이지만 211의 분해합은 215로 209의 분해합보다 작다.
그래서 flag 변수를 하나 더 만들고, 0을 출력해주는 것은 밖으로 빼주었다.
# string으로 처리 def decom(k): deN = [] for i in range(len(k)): deN.append(k[i]) sum_ = int(k) for i in deN: sum_ += int(i) return sum_ n = int(input()) flag = True for pro in range(n//2,n+1): constructor = decom(str(pro)) if constructor == n: print(pro) flag = False break if flag: print(0)
하지만.. 각 자리수로 뗴어내는 것은 생각보다 쉬웠다고 한다.
n = int(input()) flag = True for i in range(n//2,n+1): deN = list(map(int,str(i))) constructor = i + sum(deN) if constructor == n: print(i) flag = False break if flag: print(0)
'Study > 알고리즘' 카테고리의 다른 글
[백준] 1436번_영화감독숌 (0) 2020.01.28 [백준] 7568번_덩치 (0) 2020.01.28 [백준] 2798번_블랙잭 (0) 2020.01.28 [백준] 13458번_시험감독 (0) 2020.01.24 [백준] 2668번_숫자고르기 (0) 2020.01.22