-
[Java] 백준 10610 30Programming/Algorithm 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); } }
'Programming > Algorithm' 카테고리의 다른 글
[Java] 백준 11399 ATM (0) 2021.03.19 [Java] 백준 1149 RGB 거리 (0) 2021.03.16 [Java] 백준 9095 1,2,3 더하기 (0) 2021.03.13 [Java] 백준 2875 대회 or 인턴 (0) 2021.03.10 [Java] 백준 11047 동전 0 (0) 2021.03.10 댓글