[Java] 백준 2231번 문제 '분해합' 풀이
안녕하세요!!
백준 단계별 알고리즘 중 브루트 포스 문제인 분해합 문제를 풀어봤습니다
일단 문제부터 보시죠!!
https://www.acmicpc.net/problem/2231
2231번: 분해합
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이
www.acmicpc.net
맨 처음에는 분해합이 무슨 소리인가 했어요ㅋㅋㅋ
예를 들어 256이라는 수가 있는데
256은 245에서 2, 4, 5를 더하면 나오는 값입니다
여기서 2, 4, 5는 245의 자릿수입니다
그래서 저는 반복문을 사용해서 쉽게 문제를 풀었습니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main (String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer str = new StringTokenizer(bf.readLine());
int num = Integer.parseInt(str.nextToken());
//분해합 요소 중 가장 작은 숫자를 찾기위한 min
int min = 9999999;
for(int i = num-1; i > 0; i--) {
int sum = i;
for(int j = i; j > 0 ; j = j / 10) {
sum += j % 10;
}
if(sum == num)
if(min > i) min = i;
}
if(min == 9999999) System.out.println(0);
else System.out.println(min);
}
}
여기서 저는 BufferedReader를 사용했는데 그냥 익숙해지는 용으로 사용했습니다
여러분은 그냥 Scanner를 사용해도 괜찮습니다
참고로 BufferedReader를 사용하는 이유는 Scanner보다 빠르기 때문입니다
각설하고!!
다시 문제로 돌아와서 설명을 해드리면
만약 분해합 요소가 2개 이상이 나온다고 할 때
그 중 가장 작은 분해합 요소를 출력해야합니다
그래서 min이라는 변수로 가장 작은 분해합 요소를 저장합니다
그리고 만약 분해합 요소가 안 나온다면 마지막까지 min은 9999999이 나오겠죠??
그러면 0이 출력되게 하는 것입니다
이 문제는 정말 음...뭐랄까 좀 지저분한 느낌이 드는 문제였습니다
만약 숫자가 매우 크면 시간이 정말 많이 들어가는 문제이기 때문입니다
물론 저보다 더 잘 푸신 분들도 분명 있을 것이니 다른 분들의 코드도 한 번 보시면 좋겠습니다
감사합니다!!