문제
어떤 자연수 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을 출력한다.
내 풀이
처음에는 각 자리수를 계산하기 위해 10, 100 으로 나눈 나머지를 사용하려고 했습니다.
하지만 입력이 1,000,000 까지 주어지기 때문에 숫자가 커지면 100, 1000, 10000 ... 나누어야 하는 상황이 발생합니다.
자릿수에 따라 if를 걸어주기엔 너무 코드가 길어지죠.
그렇다면 나머지를 사용하는 방법이 아니라, 입력 받은 숫자를 문자열로 바꾸어 각각의 문자를 얻어 숫자를 얻도록 했습니다.
64894 라는 숫자가 들어오면 문자열 "64894"로 바꾸고, toCharArray()를 사용합니다.
toCharArray() 를 사용하면 {'6', '4', '8', '9', '4'} 로 이루어진 char배열을 얻을 수 있습니다.
이제 해당 배열을 돌면서 문자를 숫자로 바꾸어줍니다.
char 타입의 숫자를 int 타입의 숫자로 바꾸기 위해 '0'을 빼주면 됩니다. (ASCII Code)
문자 0 ~ 9 까지의 아스키코드는 48 ~ 57입니다.
따라서 문자 - '0' 을 사용하면 숫자를 얻을 수 있습니다.
ex) '7' - '0' 의 결과는 숫자 7. '7'의 아스키코드 55 - '0'의 아스키코드 48 = 7
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
int sum = i;
String num = Integer.toString(i);
char[] digits = num.toCharArray();
for (int j = 0; j < digits.length; j++) {
sum += digits[j] - '0';
}
if (sum == n) {
System.out.println(i);
return;
}
}
System.out.println("0");
}
}
'코딩테스트' 카테고리의 다른 글
[백준/Java] 1654번. 랜선 자르기 (0) | 2023.03.22 |
---|---|
[백준/Java] 회전하는 큐 (0) | 2023.03.08 |
[백준/Java] Fly me to the Alpha Centauri (0) | 2023.03.07 |
[백준/Java] 소수 구하기 (0) | 2023.03.07 |
[백준/Java] ACM 호텔 (0) | 2023.03.07 |