[백준] 2231

당당·2023년 4월 25일
0

백준

목록 보기
55/179

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

📔문제

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

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


📝입력

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


📺출력

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


📝예제 입력 1

216

📺예제 출력 1

21

🔍출처

ICPC > Regionals > Asia Pacific > Korea > Asia Regional - Seoul 2005 B번
-데이터를 추가한 사람: kimtree97, lambda, minju1307, yjwr0528


🧮알고리즘 분류

  • 브루트포스 알고리즘

📃소스 코드

import java.util.Scanner;

public class Code2231 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		int N=scanner.nextInt();
		boolean isFind=false;
		
		int i=1;
		while(i<N) {
			if(N==i+eachSum(i)) {
				isFind=true;
				break;
			}
			i++;
		}
		
		if(isFind) {
			System.out.println(i);
		}
		else {
			System.out.println(0);
		}
		
	}
	
	public static int eachSum(int n) {
		int sum=0;
		int count=0;
		boolean isRoop=true;
		int temp=n;
		int num=1;
		
		while(isRoop) {
			if(temp/10>0) {
				count++;
			}
			else {
				isRoop=false;
				break;
			}
			temp=temp/10;
		}
		
		for(int i=0;i<count;i++) {
			num=num*10;
		}
		
		while(n/10!=0) {
			sum=sum+n/num;
			n=n%num;
			num=num/10;
		}
		
		sum=sum+n;
		
		return sum;
	}

}

📰출력 결과


📂고찰

N=i+i의 각 자릿수 합이 되는 i의 최솟값을 구하면 된다.
i의 각 자릿수 합을 구하는 것이 까다로웠는데, 먼저 i 자릿수를 구하고 그 수만큼 10을 곱해서 100이든 10이든 1000이든 만든다.(근데 일의 자리는 안세야됨)

그다음 그 수와 i를 자릿수만큼 구한 10(ex.100이든 ,10이든,,)으로 나누고, 그 몫을 sum에 저장하고, i10과 같은 걸로 나눈 나머지가 되고, 10 또한 10을 나누어 1로 바꿔주자.

만약 i/10==0이 되면 일의자리 숫자가 되었으니 종료해주고,
그 수를 sum에 더하고 리턴해준다.

profile
MySQL DBA 신입 지원

0개의 댓글