[BAEKJOON] 백준 10610: 30 (C#)
문제 링크
https://www.acmicpc.net/problem/10610
문제
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
입력
N을 입력받는다. N는 최대 10^5개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
출력
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

통과한 답안
namespace _10610
{
internal class Program
{
static void Main(string[] args)
{
char[] inputs = Console.ReadLine().ToArray();
string answer = Make30(inputs);
Console.WriteLine(answer);
}
static string Make30(char[] inputs)
{
if (!inputs.Contains('0'))
{
return "-1";
}
int sumOfDigits = inputs.Sum(x => x - '0');
if (sumOfDigits % 3 != 0)
{
return "-1";
}
Array.Sort(inputs);
Array.Reverse(inputs);
return new string(inputs);
}
}
}
숫자가 주어졌을 때, 이 숫자에 적힌 숫자를 재조합하여
30의 배수 중의 가장 큰 수를 찾는 문제이다.
이를 숫자의 계산으로 작업을 하기에는 너무 큰 숫자가 입력될 수 있으므로,
string의 상태로 계산하여 결과를 출력하도록 작성하였다.
주어진 n을 각각 char로 나눠서 배열에 저장하고,
Make30이라는 매서드를 작성하여 이를 이용하여 가장 큰 30의 배수를 찾도록 하였다.
30의 배수가 될 조건을 살펴보면,
1. 숫자에 0이 들어갈 것 -> 해당 숫자가 10의 배수인지 확인
2. 각 자릿수의 합이 3의 배수인지 확인 -> 해당 숫자가 3의 배수인지 확인
이 두 가지 방법을 이용하여 해당 숫자가 30의 배수인지 확인할 수 있게 된다.
이후에 주어진 배열을 정렬하여 가장 큰 값을 나타내게 유도하고
이를 new string(inputs)로 새로운 string으로 조립하여 return하도록 구현하였다.