Programming/Algorithm
[Java] 백준 10610 30
Yejii
2021. 3. 15. 23:58
문제
숫자 N이 주어진다.
해당 숫자를 이루고 있는 수들을 이용해서 만들 수 있는 가장 큰 30의 배수를 출력하는 문제이다.
풀이
처음에는 받아온 N이라는 숫자를 char[]로 쪼개어서,
만들 수 있는 모든 조합을 만들다가 가장 큰 30의 배수가 나오면 출력하게끔 짰다.
근데 NumberFormat Exception이 발생했다.
다시 문제를 자세히 살펴보니, 주어진 N이라는 수의 자릿수가 최대 10^5라는 조건이 있었다.
최댓값이 10^5(100_000)라는 것으로 착각했던것..
이 조건을 생각하면 long타입으로도 조합을 만들 수가 없다.
다른 분들의 코드를 참고해서 풀었다.
풀이의 핵심은 다음과 같다.
- 30의 배수는 10의 배수이므로 끝자리가 0이다.
=> N에 0이 포함되어 있지 않다면 30의 배수를 만들 수 없음
- 30의 배수는 3의 배수이므로 모든 자릿수를 합했을 때도 3이 나온다.
=> 3의 배수를 나열해보자. 3, 6, 9, 12, 15, 18..... 각 자릿수를 더하면 3의 배수가 나온다는 규칙이 있으므로
=> 이 규칙을 활용해서 조건을 처리한다.
코드
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String N = br.readLine();
int[] nums = new int[10]; // 0~9까지 각 숫자가 몇 개씩 있는지를 저장
int sum = 0;
for (int i = 0; i < N.length(); i++) {
int n = N.charAt(i) - '0';
nums[n]++;
sum += n;
}
// 조건1. 0이 최소 하나 있어야 한다.
// 조건2. 자릿수의 총합이 3의 배수여야 한다.
if (nums[0] == 0 || sum % 3 != 0){
System.out.println(-1);
return;
}
// 조건이 성립하다면 만들 수 있는 모든 조합이 3의 배수이다.
// 따라서 큰 숫자부터 거꾸로 더해가며 결과값을 만든다.
StringBuilder sb = new StringBuilder();
for (int i = 9; i >= 0; i--) {
while(nums[i]-- > 0){
sb.append(i);
}
}
System.out.println(sb);
}
}