코테 기록
백준 10610번 30 자바 풀이
배성인
2022. 12. 27. 16:54
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
/*
30 다국어
시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 256 MB 37794 14895 11801 38.945%
문제
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
입력
N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
출력
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.
예제 입력 1
30
예제 출력 1
30
예제 입력 2
102
예제 출력 2
210
예제 입력 3
2931
예제 출력 3
-1
예제 입력 4
80875542
예제 출력 4
88755420
출처
Contest > Croatian Open Competition in Informatics > COCI 2014/2015 > Contest #4 1번
문제를 번역한 사람: aaa
* */
public class Main {
public static void main(String[] args) throws IOException {
//0. 배수판정법에 의하면 30의 배수는 3의 배수이면서 일의 자리가 0인 수이다.
//1. 일의 자리가 0인 수
//2. 3의 배수: 각 자리 수의 합이 3의 배수인 수이다.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String string = bufferedReader.readLine().trim();
boolean containBoolean = string.contains("0");
//1. 일의 자리가 0인 수. 0포함 안 돼있으면 -1
if(containBoolean == false) {
System.out.println(-1);
return;
}
//1. 일의 자리가 0인 수. 0포함 안 돼있으면 -1 끝
char[] chars = string.toCharArray();
Integer[] ints = new Integer[chars.length];
//int[] ints = new int[chars.length]; Arrays.sort 쓸려고 Wrapper클래스로 변경
for (int i = 0; i < chars.length; i++) {
ints[i] = Integer.parseInt(String.valueOf(chars[i]));
}
//2. 3의 배수: 각 자리 수의 합이 3의 배수인 수이다.
int sum = 0;
for (int intValue:ints) {
sum += intValue;
}
if(sum%3 != 0) {
System.out.println(-1);
return;
}
//2. 3의 배수: 각 자리 수의 합이 3의 배수인 수이다. 끝
Arrays.sort(ints, Collections.reverseOrder());//역순 정렬
StringBuilder result = new StringBuilder();
for (int i = 0; i < ints.length; i++) { //int배열 string으로 붙임
result.append(ints[i]);
}
System.out.println(result);
}
}
배수판정법을 알아야 풀 수 있는 문제였다.
30의 배수판정법은 3의 배수이면서 일의 자리가 0인 수였다.
0이 아예 없으면 바로 리턴 시켰고
3의 배수는 각 자리 수의 합이 3의 배수인 수여서 각 자리 수 더해서 계산했다.
가장 큰 값을 가져와야해서 내림차순으로 정렬했다.