[ Baekjoon ] 2231번 ( Bronze II ) : 분해합 (Java)

ma.caron_g·2022년 1월 9일
0
post-thumbnail

1. Problem 📃

[ 분해합 ]

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


[ 문제 ]

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.


2. Input 📇

[ 입력 ]

첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.


3. Output 📠

[ 출력 ]

첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.


4. Example 📚

[ 입출력 예시 ]

예제 입력예제 출력
216198

5. Solution 🔑

자리수의 합의 최대는 9로 채워져있을 때이다.


1. 입력되는 수를 받을 변수(N)을 선언하여 값을 받아준다.


2. N에서 N의 자릿수 9를 하여 어느 수와 그 수의 자릿수를 더했을 때의 N이라는 값이 나올 수 있는지에 대한 값을 찾는다.
ex) N = 100 이라면 9
3 = 27 해서 63부터 100까지 중에서의 값들만 조건을 충족시킬 수 있다.


3. 가장 최솟값을 range라는 변수에 담아주었다. 이제 i = range부터 i<=N까지의 수들을 하나씩 다 확인해준다.


4. 각 자리수의 합은 placeSum이라는 메서드를 만들어 재귀함수를 사용하여 구해주었다.
매개변수로 값(num)을 받고, 이 값이 10을 넘어가면, num%10 으로 일의 자리 수에 그 다음 placeSum(num/10)을 하여 일의 자리를 제외한 그 다음 수로 계속 자릿수가 더해지게 한다.


5. 만약 이 자릿수 값이 N과 더했을 때 N과 같은 값을 가지면 num을 출력하고 종료하며, 값이 없다면, 0을 출력한다.


6. Code 💻

import java.util.Scanner;

public class Main {

	public static int placeSum(int num) {
		if(num < 10) {
			return num;
		}
			return num%10 + placeSum(num/10);
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		int range = N - 9*(Integer.toString(N).length());
		int sum = 0;
		
		for(int i=range; i<=N; i++) {
			sum = i + placeSum(i);
			if(sum == N) {
				System.out.println(i);
				break;
			}
			else if(i==N) {
				System.out.println(0);
			}
		}
	}

}
profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글