BOJ 10610

2020-04-16

위 문제는 백준 사이트의 알고리즘 10610 문제에 관한 설명입니다.


문제

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에,

그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

입력

N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner scanner =new Scanner(System.in);
		String N = scanner.nextLine(); //문자열 받고
		int[] Number = new int[10];//0~9까지 숫자 배열
		int index = 0;//index
		int sum =0;//모든 숫자들의 합

		for(int i =0; i< N.length();i++)
		{
			index = N.charAt(i)-'0'; // 숫자판별후
			sum += index;//sum에 숫자 더하고
			Number[index]++;//배열에 그 숫자의 갯수 카운트
		}
		if(Number[0]==0||sum %3 != 0)
		{
			System.out.println("-1");//그 수가 존재하지 않는다면, -1을 출력하라.
			return;
		}
		for(int i = 9; i>=0;i--)
		{
			while(Number[i]>0)
			{
				System.out.print(i);
				Number[i]--;
			}
		}
	}
}

/*30의 배수가 되기위한 조건은?
1.일단 무조건 0이 한개 포함되어있어야함
왜냐? 맨 마지막에 0이 들어가야 일단은 30의 0을 만족할 수 있음.

2.3의 배수여야함
모든 숫자의 합이 3의 배수 예를 들어
3*1 = 3
3*2 = 6
...
3*21 = 63
3*58 = 174 여기에 0 만붙이면 30의 배수
*/

30