본문 바로가기
알고리즘/백준

2231번 문제 : 분해합

by son_i 2023. 3. 7.
728x90

2231번: 분해합 (acmicpc.net)

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

알고리즘 생각

 

자연수 N이 주어졌을 때 N의 가장 작은 생성자 구하기

ex) 216이 주어졌다면 생성자는 198

198+1+9+8 = 216

구해야되는 숫자 x, 그 숫자의 각 자릿수를 더해서 N이 나와야함

 

num을 조건으로 for문 돌려서 i를 증가시키면서 조건문에 값과 각 자릿수의 합이 num인 거 찾으면 끝나

 

		for(int i=0;i<num;i++) {
			if(i + (i%100)+(i/10)%10+(i%10) == num) {
				System.out.println(i);
				break;
			}
		}

이렇게 했는데 99 가 출력됨. 조건식에서 99+99+9+9 돼서 216은 맞지만 자릿수를 더한게 아니게 됐음.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class MainApp{
	public static void main(String[] args) throws IOException  {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String strnum = br.readLine(); //숫자하나 입력받음 -> 일단 문자로 받음 !
		int numlength = strnum.length();
		int x =0;
		int sum = 0;
		int i;
		int num = Integer.parseInt(strnum);
		for(i=10;i<num;i++) {
			sum = i % 10; //1의자릿수
			x = i / 10;
			for(int j=1;j<numlength;j++) {//몇 자리수인지에 따라 자릿수를 구하는 반복문
				sum += x % 10;//10의자릿수
				x = x / 10;
				sum += x; //100의자릿수 3자리라고 가정했을 때
				if(Integer.toString(x).length()==1)
					break;
			}
			if(sum+i == num) {
				System.out.println(i);
				break;
			}
		}}
}

이렇게 했는데 틀렸다고 뜸 그 생성자가 없을 때 0 출력한다는 조건을 만족 못 해서 일어난 일

 

근데 나는 코드가 너무 어린이 코드같다 ... 더 멋있게 하는 방법을 찾아봐야겠어

자릿수 구하는 알고리즘이 저렇게 되면 안 될 거 같다.

 

1시간 45분만에 맞췄다 .. ㅋㅋㅋㅋ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class MainApp{
	public static void main(String[] args) throws IOException  {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String strnum = br.readLine(); //숫자하나 입력받음 -> 일단 문자로 받음 !
		int sum = 0;
		int result =0;
		int num = Integer.parseInt(strnum);
		
		String []numarr = new String[10000]; //문자열 배열
		
		for(int j = num/2;j<num; j++) {
			sum=0;
			numarr[0] = Integer.toString(j); //계속 검증해줄 수를 문자열로 만들어서 배열에 넣음
			for(int i=0;i<numarr[0].length();i++) {// 자리수를 다 더하는 반복문
				sum += Character.getNumericValue(numarr[0].charAt(i));
				}
			if(j+sum==num) {
				result = j;
				break;
			}
		}
		System.out.println(result);
	}
}

** 새로 알게된 것 숫자를 찢을 때

각 자리의 수를 구하고 싶은 숫자를 문자열 배열에 넣고

그 숫자를 charAt을 이용해서 문자로 하나씩 찢는다. -> 그리고 정수형으로 변경. 

문자-> 정수형 : 사용한 함수 Character.getNumericValue(Char c) ; 

 

숫자 -> 문자열 : Integer.toString(int 값);

문자열 -> 숫자 : Integer.parseInt(문자열 값);

문자열 -> 문자 : String.charAt(인덱스)

문자 -> 숫자 : Character.getNumericValue(Char값);