상세 컨텐츠

본문 제목

백준#10610 - 30

C#/알고리즘

by McRobbin 2020. 4. 10. 12:09

본문

https://www.acmicpc.net/problem/10610

 

10610번: 30

문제 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다. 미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라. 입력 N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다. 출력 미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는

www.acmicpc.net

그리디 알고리즘의 30 문제 입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _10610
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            int zeroCount = 0;
            int digitSum = 0;
 
            //각 숫자를 하나씩 저장할 리스트.
            var intList = new List<int>();
 
            for(int i = 0; i < input.Length; i++)
            {
                int digitNum = int.Parse(input.Substring(i, 1));
                //각 자릿수 합.
                digitSum += digitNum;
                if (digitNum == 0)
                    zeroCount++;
                intList.Add(digitNum);
            }
 
            //자릿수 합의 나머지가 0이 아니거나 0이 없으면 30의 배수 불가.
            //숫자가 모두 0으로 채워진 경우 또한 불가능.
            if (digitSum % 3 != 0 || zeroCount == 0 || zeroCount == intList.Count)
                Console.WriteLine("{0}"-1);
 
 
            //이는 만들어질 수 있으므로 Sort후 뒤집어서 출력.
            else
            {
                intList.Sort();
                intList.Reverse();
                foreach (int num in intList)
                    Console.Write(num);
            }
        }
    }
}
 
 
 

string 형식의 긴 숫자를 받아 이를 이용해 가장 큰 30의 배수로 만드는 문제 입니다.

30의 배수는 3 * 10 이기 때문에 10의 배수가 되어야 하고 3의 배수가 돼야 합니다.

10의 배수는 일의 자리에 0이 반드시 필요하며 3의 배수는 수의 모든 자릿수 합이 3의 배수가

되어야 합니다.

 

인풋을 string으로 받아 각 자리를 int로 변환, list에 넣어주었습니다 이 과정에서 확인하는 것이 있습니다.

 

1 : 0의 갯수를 세어주겠습니다. 0의 갯수가 한개도 없거나 모두 0이면 30의 배수가 될 수 없습니다.

2 : 각 자릿수를 계속해서 더해 digitSum에 저장하겠습니다. 이 값을 3으로 나눈 나머지가 0이 아니면 3의 배수가 아닙니다.

 

이 둘을 통과했다면 30의 배수로 만들수 있는 값이며 list에 있는 한자리씩의 정수를 Sort, Reverse하여 큰것부터 차례대로 오도록 하고 이를 순서대로 출력 했습니다.

'C# > 알고리즘' 카테고리의 다른 글

백준#1541 - 잃어버린 괄호  (0) 2020.04.11
백준#2875 - 대회 or 인턴  (0) 2020.04.11
백준#2217 - 로프  (0) 2020.04.09
백준#2884 - 알람시계  (0) 2020.04.09
백준#14681 - 사분면 고르기  (0) 2020.04.09

관련글 더보기