백준(Backjoon) 10610, 30

2021. 6. 23. 12:13CodingTest

문제 설명

문제풀이

배수 판정법에 따르면 30의 배수 판정법은 3의 배수이면서 일의 자리가 0인수이면 30의 배수로 판정 가능하다.

3의 배수는 각 자리의 수의 합이 3 배수이면 3의 배수이다. 따라서 30의 배수는 각 자리의 합이 3의 배수이고 일의 자리가 0인수이면 30의 배수이다. 

 

N은 10^5개의 숫자로 구성되어 있기 때문에 정수 변수로 받지 않고 문자열 변수로 받아서 각 자리의 숫자를 쪼개서 정수형 리스트에 저장한다. 그리고 30배수가 되는 가장 큰수를 찾기 위해서 저장한 정수형 리스트를 내림차순으로 정렬하여 30 배수 판정법을 적용한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;



public class Main {
	

	/* 
	 * 3의 배수 판정법 : 각 자리의 합이 3의 배수
	 * 30의 배수 판정법 : 3의 배수이면서 일의 자리가 0인수
	 * 
	 * 즉, 30의 배수 판정법은 각 자리의 합이 3의 배수이고 일의 자리가 0인수이면 30의 배수이다.
	 * */
	public static String solution(List<Integer> numbers)
	{
		Collections.sort(numbers, Collections.reverseOrder());
		int sum = numbers.stream().mapToInt(Integer::intValue).sum();
		
		if(sum%3==0 && numbers.get(numbers.size()-1)==0)
		{
			return numbers.stream().map(String::valueOf).collect(Collectors.joining());
		}
		else
		{
			return "-1";
		}
		
	}
	public static void main(String args[]) throws IOException
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		List<Integer> numbers = Arrays.asList(br.readLine().split(""))
								.stream()
								.map(Integer::parseInt)
								.collect(Collectors.toList());
		
		System.out.println(solution(numbers));
	}
}

References

나무 위키 배수 판정법 : https://ko.wikipedia.org/wiki/%EB%B0%B0%EC%88%98_%ED%8C%90%EC%A0%95%EB%B2%95