코딩테스트/BOJ

[BOJ] 10610 30 - JAVA

5월._. 2022. 7. 7.
728x90

1. 문제

 

10610번: 30

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한

www.acmicpc.net

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.


2. 풀이

1.  새로 만들 수는 30의 배수다. 따라서 10의 배수임과 동시에 3의 배수여야 한다. 따라서 끝자리는 무조건 0이고 모든 자리수의 합은 3의 배수여야한다.

2.  입력값을 char 배열로 받고 정렬한다.

3.  끝부터 반복문을 돌면서 문자열 - '0' 값을 sum에 더한다. 동시에 StringBuilder에 문자열을 추가한다.

4.  sum이 3의 배수가 아니거나 input[0]이 '0'이 아니라면 30의 배수를 만들 수 없다. -1을 출력하고 종료한다.

5.  4에서 끝나지 않았다면 StringBuilder를 출력한다.

import java.io.*;
import java.util.*;

public class BOJ_10610_30 {
   public static void main(String[] args) throws IOException {
      //2의 배수, 5의 배수, 3의 배수여야함
      //2의 배수 --> 끝자리가 짝수
      //5의 배수 --> 끝자리가 0, 5
      //10의 배수--> 끝자리가 0
      //3의 배수 --> 전부 합쳐서 3의 배수

      char[] input = new BufferedReader(new InputStreamReader(System.in)).readLine().toCharArray();
      int sum = 0;
      Arrays.sort(input);
      StringBuilder sb = new StringBuilder();

      for(int i=input.length-1;i>=0;i--){
         sum +=input[i]-'0';
         sb.append(input[i]);
      }

      //3의 배수,10의 배수 가능성 체크
      if(sum%3!=0 || input[0]!='0'){
         System.out.println(-1);
         return;
      }

      System.out.println(sb);
   }
}

3. 결과

댓글