PS/BOJ
10610
easy16
2022. 5. 8. 00:23
30 : https://www.acmicpc.net/problem/10610
그리디 문제...
순열과 이것 저것 시도해보다 자리수가 10^5인 것을 보고 String으로 선회했다.
배수판정법 위키를 찾아보니..
https://ko.wikipedia.org/wiki/%EB%B0%B0%EC%88%98_%ED%8C%90%EC%A0%95%EB%B2%95
30의 배수 판정법은 두가지 조건을 만족한다.
1. 각자리수의 합이 3의 배수일 것
2. 0으로 끝날 것
위 조건만 알면 코딩은 별게 없다.
0을 뒤로 빼거나 다른 걸 생각할 필요없이 내림차순 정렬한 값이 최대값이 된다.
그리디란... 참 알면 별거 아닌것 같고, 코드는 효율적인데 처음 봤을 땐 직관적이지 않아서 나랑은 잘 안맞는 것 같다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.util.*;
public class Main {
static int N;
static boolean DBG = false;
static boolean[] visited;
static Integer[] arr;
static String answer = "-1";
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
String s = st.nextToken();
arr = new Integer[s.length()];
int sum =0;
int idx= s.length()-1;
for (char c : s.toCharArray()) {
arr[idx] = c-'0' ;
sum += arr[idx];
idx--;
}
if ( sum % 3 ==0 && s.lastIndexOf('0') !=-1 ) {
Arrays.sort(arr, Collections.reverseOrder());
StringBuilder sb =new StringBuilder();
for ( int v : arr)
sb.append(v);
answer = sb.toString();
} else {
System.out.println(answer);
}
}
}