[백준] 2231. 분해합

진예·2023년 10월 7일
0

Baekjoon : JAVA

목록 보기
19/76
post-thumbnail

📌 문제

[2231] 분해합

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

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

⬇️ 입력

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

⬆️ 출력

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

💡 코드

n을 입력 받아 n 이전의 수까지 어떤 자연수 + 각 자릿수의 합을 수행하여 이 값이 ```n```과 같아지는 즉시 해당 자연수를 출력한 후 실행을 종료하고, 같아지는 경우가 없으면 0을 출력한다.

각 자릿수의 합을 n을 String 타입으로 변환하여 각 자릿수를 추출해 다시 int형으로 변환하여 int형 타입 배열 arr[]에 담아 각 요소를 더하는 방식으로 구했는데,, 정답이긴 했으나 이 과정에서 메모리를 엄청 써먹었다,, 무려 104504KB,, 다시 보니 배열은 필요도 없는데 굳이 왜 만들었지? ➕ 자릿수 구하는 공식 냅두고 굳이 변환변환... 할 필요가 있나? 🟰 환장의 콤보 ^^

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		for(int i=1;i<n;i++) {
			String s = String.valueOf(i);
			int[] arr = new int[s.length()];
			int sum = 0;
			
			for(int j=0;j<arr.length;j++) {
				arr[j] = s.charAt(j) - '0';
				sum += arr[j];
			}
			
			if(sum + i == n) {
				bw.write(i + ""); bw.close();
				return;
			}
		}
		bw.write("0");
		
		br.close();
		bw.close();
	}
}	

➕ 다른 사람의 코드 : 자릿수 구하는 코드의 정석,, num % 10 해서 한 자리씩 뗀 다음에 num / 10 해주기,, 나도 이 방법을 생각 안했던 건 아니지만 괜히 이상한 오기가 생겨서 위 코드 처럼 풀어봤던건데,, 사람들이 안하는 데는 다 이유가 있는 법이다 ㅎ,,

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		for(int i=1;i<n;i++) {
			int sum = 0;
			int num = i;
			
			while(num != 0) {
				sum += num % 10;
				num /= 10;
			}
			
			if(sum + i == n) {
				bw.write(i + ""); bw.close();
				return;
			}
		}
		bw.write("0");
		
		br.close();
		bw.close();
	}
}	

profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글