Eat the ENAK
BOJ2231 - 분해합 본문
문제 바로가기
https://www.acmicpc.net/problem/2231
Solved.ac* 난이도
* Solved.ac는 백준 온라인 저지의 문제들에 난이도를 매겨주는 서비스입니다. 자세한 내용은 홈페이지를 참고해주세요.
본문
해설
https://github.com/return0927/CodingWrite-UP/blob/master/BOJ/2231/2231.py
이 문제에서 "생성자"라는 개념이 나오는데, 어떤 주어진 자연수 \(M\)에 대해, \(M\) 그 자체와 \(M\)의 각 자리수의 합을 더한 것이 자연수 \(N\)일 때, \(M\)은 \(N\)의 생성자라고 한다. 문제의 설명에서는 방금 설명한 \(M\), \(N\)을 바꾸어 설명하는데, 입력값과 동일시하기 위해 바꿔서 말했다.
입력 첫 줄에 \(N\)이 주어지는데, 이 \(N\)의 최소의 생성자 \(M\)을 찾는 문제이다. 간단히 1부터 \(N\)까지 for로 돌며 구하면 될 것 같다. 먼저 생성자의 분해합을 구하는 함수부터 구현하자.
creation = lambda n: n + sum(map(int, list(str(n))))
엥? 이게 함수인가요? JS에서 (funciton()=>{})처럼 Python에도 람다함수가 있다. PEP에서는 람다함수를 지양하라고 하고 있지만, 한 줄로 표현되는게 얼마나 깔끔한지 모른다. 이 람다함수를 이용해 정의한 것이다. 이걸 def문으로 바꿔쓰면 아래와 같다.
def creation(n):
return n + sum(map(int, list(str(n))))
개인 취향에 따라 쓰면 될 듯하다.
이후 입력값을 받아 생성자를 찾아주면 된다.
n = int(input())
creation = lambda n: n + sum(map(int, list(str(n))))
for i in range(1, n+1):
if n == creation(i):
print(i)
exit()
print(0)
사실 이 문제를 2일동안이나 붙잡았는데, 생성자가 없는 경우 0을 출력해야하는데 안해서다! 꼭 문제를 잘 읽기 바란다
'PS: Problem Solving > BOJ: 백준온라인저지' 카테고리의 다른 글
BOJ1436 - 영화감독 숌 (0) | 2019.10.30 |
---|---|
BOJ2750 - 수 정렬하기 (0) | 2019.10.30 |
BOJ2798 - 블랙잭 (0) | 2019.10.29 |
BOJ1978 - 소수 찾기 (0) | 2019.10.29 |
BOJ2581 - 소수 (0) | 2019.10.29 |