
❓ 문제
어떤 자연수 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을 출력한다.
예제 1
입력
216
출력
198
❗ 내 풀이
import java.util.*;
class Main { // Digit Generator
public static void main(String[] str) {
Scanner sc = new Scanner(System.in);
int M = sc.nextInt();
int result = 0;
for(int i = 1; i <= M ; i++) {
int sum = i;
String[] strNum = String.valueOf(i).split("");
int[] num = new int[strNum.length];
for(int j = 0; j < num.length ; j++) {
num[j] = Integer.parseInt(strNum[j]);
sum += num[j];
}
if(sum == M) {
result = i;
break;
}
}
System.out.println(result);
}
}
브루트 포스 알고리즘은 모든 경우의 수를 탐색하는 것이다. 그에 맞춰 1부터 입력받은 M에 오기 전까지 모든 수를 탐색한다.
한 자리가 넘어가는 수일 경우 각 자릿수마다 더해야 하기에 문자로 변환 후 길이와 각 자릿수를 가져와 합을 계산해주었다.
❗ 다른 사람 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main { // DigitGenerator
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String autok = br.readLine();
int c = Integer.valueOf(autok);
int i = c - String.valueOf(c).length() * 9;
int m = 0;
while(true) {
i++;
System.out.println(i);
char[] c_arr = String.valueOf(i).toCharArray() ;
int sum = i;
for(int ca=0;ca < c_arr.length;ca++) {
sum += (c_arr[ca]-48);
}
m = sum;
if(sum == c || i >= c) {
break;
}
}
if(m != c) i = 0;
System.out.println(i);
}
}
나의 경우는 완전 탐색으로 모든 경우를 다 돌면서 결과를 도출하였다.
하지만 다른 사람의 풀이인 경우에는 나올 수 있는 최솟값을 구하여 최솟값부터 최댓값까지만 돌면서 값을 구하였다.
N은 분해합이 되는 최솟값이며 K는 입력받은 값이고 K1은 K의 일의 자릿수, K2는 K의 십의 자릿수이다.
만약, K가 세 자리 수라고 가정하자.
N = K + K1 + K2 + K3
이항하면
K = N - (K1 + K2 + K3)
K가 최솟값이 되기 위해서는 (K1 + K2 + K3)가 최댓값이 되어야 한다.
(K1 + K2 + K3)의 최댓값은 각 자리마다 9가 들어간 것이기에 (9 + 9 + 9)가 된다.
그래서 N - (자릿수 X 9)를 한 값부터 입력받은 값까지 탐색하여 분해합을 구하였다.
🚩 Detail
- 날짜 : 2022.04.18
- 단계 : 브루트 포스
- 제목 : 분해합
- URL : https://www.acmicpc.net/problem/2231
'알고리즘 > 문제풀이' 카테고리의 다른 글
[백준알고리즘] 10815. 숫자 카드 풀이 (Java) (2) | 2022.06.10 |
---|---|
[백준알고리즘] 7568. 덩치 풀이 (Java) (0) | 2022.04.26 |
[백준알고리즘] 2798. 블랙잭 풀이 (Java) (1) | 2022.04.12 |
[LeetCode] 20. Valid Parentheses (Easy) 풀이 (1) | 2022.03.16 |
[LeetCode] 14. Longest Common Prefix (Easy) 풀이 (1) | 2022.03.16 |