Eat the ENAK

BOJ2231 - 분해합 본문

PS: Problem Solving/BOJ: 백준온라인저지

BOJ2231 - 분해합

으낙 2019. 10. 29. 14:22

문제 바로가기

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
Comments