2231번 분해합

FinalForever·2026년 1월 13일
post-thumbnail

2231 분해합

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

문제를 잘못 읽고, 개념도 이해를 못하고

자꾸 각자릿수 덧셈 로직만 하고 거기서
입력받은 수 - 각자리수를 계산하고 있었다.
그래서 계속 계속 몇시간을 돌고있었다.

제출

import java.util.*;

public class BruteForce {
	public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt(); // 입력받는 수
        int M = 0;	// 생성자 저장 변수
        
        for(int i=0; i<N; i++) {
        	int sum = 0; 
            int num = i; // 자릿수를 계산하는 변수
            
        while(num != 0) {
    		sum += num % 10; 
        	num /= 10;
       }
       
       // sum 자릿수의 합 + 각 자리수의 덧셈이 = 입력값 N이라면 
        	if(sum + i == N) {
        		M = i;
        		break;
        	}
        }
        
            System.out.println(M);
            sc.close();
    }
}
               

핵심 로직

// sum 자릿수의 합 + 각 자리수의 덧셈이 = 입력값 N이라면 
        	if(sum + i == N) {
        		M = i;
        		break;
        	}

[프로그래머스] 각자리수 더하기

int answer = 0;
whle(N>0) {
	answer += N%10;
     	N/=10; 
}

내가 자꾸 오류에 부딪힌 이유는

ps. BruteForce 개념을 대충 숙지하고 푼게 가장 큰것 같다. 
1~N까지 단순하고 모든 것을 다 탐색하면서 찾아보겠다는 로직으로 당연히 
"for(int = 0; i<N; i++) 선언해서 (i);변수에 저장하면 되잖아! 
각자리수 더하는 코드를 for문 중간에 넣고" 진짜 단순하게 생각했다. 
일단 한번 더 복습하는 시간이 매우 중요하다는 생각이 들었다. 
내가 쓴코드를 밥먹으면서 자기전에도 읽어주는데, 내 코드만이 정답이 아니니까... 
공부가 더 필요하다. 일단 백준을 매일 푸는것도 중요한데, 내가 여태껐 풀었던 문제중에서 
다시 풀어보고 싶거나 개념을 다시 다루고 싶은건 벨로그에서 다시 코드를 구현해 볼 것이다. 

profile
No More Struggle & Machine Mind

0개의 댓글