[BAEKJOON] 백준 10610: 30 (C#)

2024. 6. 5. 21:39IT/BaekJoon

문제 링크

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하도록 구현하였다.