
- 티어 : Sliver 4
- 정답여부 :
오답- 알고리즘 유형 :
수학,그리디 알고리즘,문자열,정렬- 시간 제한 :
1초
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.
30
30
102
210
2931
-1
80875542
88755420
각 자리 숫자를 재배치하여 만들 수 있는 가장 큰 숫자 중 30의 배수가 되는 가장 큰 숫자를 만들면 되는 문제
Javapackage algorithms_Java03_06; import java.io.*; import java.util.*; public class baekjoon_10610 { public static void main(String[] args) throws IOException{ 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); } }
O(n log n)
처음 문제가 이해가 안 가서 코드를 작성하는데 시간이 오래 걸린거 같다. 그래서 구글링을 통해 문제를 이해 했다..
좀 더 이해하기 쉬운 코드를 가져와봤다.
Javaimport java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Comparator; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String N = br.readLine(); ArrayList<Integer> list = new ArrayList<>(); for(int i=0; i<N.length(); i++) { list.add(N.charAt(i) - '0'); } if(list.contains(0) == false) { System.out.println(-1); return; } int sum = 0; for(int i=0; i<N.length(); i++) { sum = sum + list.get(i); } if(sum % 3 != 0 || sum == 0) { System.out.println(-1); return; } else { list.sort(Comparator.reverseOrder()); } for(int i=0; i<N.length(); i++) { System.out.print(list.get(i)); } } }
문제를 보면 무엇을 구현해야할지 찾아야 할지 딱 답이 나와야 알고리즘을 설계하는데 문제가 없는데 그게 힘들다 ㅠㅠ