[BAEKJOON] 백준 3040: 백설 공주와 일곱 난쟁이 (C#)

2024. 6. 3. 19:18IT/BaekJoon

문제 링크

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

 

 

문제

매일 매일 일곱 난쟁이는 광산으로 일을 하러 간다. 난쟁이가 일을 하는 동안 백설공주는 그들을 위해 저녁 식사를 준비한다. 백설공주는 의자 일곱개, 접시 일곱개, 나이프 일곱개를 준비한다.

어느 날 광산에서 아홉 난쟁이가 돌아왔다. (왜 그리고 어떻게 아홉 난쟁이가 돌아왔는지는 아무도 모른다) 아홉 난쟁이는 각각 자신이 백설공주의 일곱 난쟁이라고 우기고 있다.

백설공주는 이런 일이 생길 것을 대비해서, 난쟁이가 쓰고 다니는 모자에 100보다 작은 양의 정수를 적어 놓았다. 사실 백설 공주는 공주가 되기 전에 매우 유명한 수학자였다. 따라서, 일곱 난쟁이의 모자에 쓰여 있는 숫자의 합이 100이 되도록 적어 놓았다.

아홉 난쟁이의 모자에 쓰여 있는 수가 주어졌을 때, 일곱 난쟁이를 찾는 프로그램을 작성하시오. (아홉 개의 수 중 합이 100이 되는 일곱 개의 수를 찾으시오)

 

 

입력

총 아홉개 줄에 1보다 크거나 같고 99보다 작거나 같은 자연수가 주어진다. 모든 숫자는 서로 다르다. 또, 항상 답이 유일한 경우만 입력으로 주어진다.

 

 

출력

일곱 난쟁이가 쓴 모자에 쓰여 있는 수를 한 줄에 하나씩 출력한다.

 

 

 

통과한 답안

namespace _3040
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] dwarfs = new int[9];
            for (int i = 0; i < 9; i++)
            {
                dwarfs[i] = int.Parse(Console.ReadLine());
            }

            int sum = dwarfs.Sum();
            List<int> result = new List<int>();

            for (int i = 0; i < 9; i++)
            {
                for (int j = i + 1; j < 9; j++)
                {
                    if (sum - dwarfs[i] - dwarfs[j] == 100)
                    {
                        for (int k = 0; k < 9; k++)
                        {
                            if (k != i && k != j)
                            {
                                result.Add(dwarfs[k]);
                            }
                        }

                        foreach (int k in result)
                        {
                            Console.WriteLine(k);
                        }
                        return;
                    }
                }
            }
        }
    }
}

 

9개의 수가 주어졌을 때, 그 중 7개를 더해서 100을 만드는 7개의 숫자를 찾는 문제이다.

배열을 이용해서 처음의 9개의 수를 받아온 뒤에

이중 for 문을 이용하여 두 수를 골랐을 때, 나머지 7개의 수로 100을 만드는 두 수를 고르고

그 수를 뺀 나머지 7개의 수를 새로운 List에 추가한 뒤에

이들을 출력하는 방식으로 작성하였다.

 

이 문제에서 처음에 9개의 수를 List로 받아온 뒤에

이를 제거하고 남은 List의 원소들을 출력하는 방식도 이용할 수 있었으나,

이 경우의 인덱스 문제가 발생할 수 있기 때문에

새로운 List(혹은 배열)를 생성한 후에 저장하여 출력하는 방식으로 작성하였다.

 

위는 새로운 List를 작성하여 해당 리스트에 7개의 수를 입력한 뒤에 출력한 결과이고

아래는 List에서 2개의 수를 제거한 뒤에 출력한 결과이다.

둘의 차이는 아래는 List를 하나 사용하므로

메모리가 덜 사용되고 코드가 좀 더 짧다는 장점이 있으나,

인덱스 문제가 발생할 수 있는 단점이 있고

 

위는 새로운 List를 사용하므로 메모리를 좀 더 사용하고 코드가 길어진다는 단점이 있으나

인덱스로 생기는 문제를 방지할 수 있어 좀 더 안정적인 코드라는 장점이 있다.