[BAEKJOON] 백준 2204: 도비의 난독증 테스트 (C#)

2024. 5. 28. 19:09IT/BaekJoon

문제 링크

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

 

 

문제

꿍은 도비에게 영어단어들을 제시한 후 어떤 단어가 대소문자를 구분하지 않고 사전순으로 가장 앞서는지 맞추면 양말을 주어 자유를 얻게해준다고 하였다.

하지만 인성이 좋지 않은 꿍은 사실 그러고 싶지 않았기 때문에 대소문자를 마구 섞어가며 단어들을 제시했다. 예를 들어, apPle은 Bat보다 앞서지만 AnT보다는 뒤에 있는 단어다.

도비에게 희망은 여러분뿐이다! 여러분이 도비에게 자유를 선물해주도록 하자!

 

 

입력

각 테스트케이스는 정수 n (2 ≤ n ≤ 1000) 으로 시작하며 주어지는 단어의 개수를 뜻한다.

다음 각 n줄은 길이가 최대 20인 단어가 주어지며 대소문자의 구분을 없앴을 때 똑같은 단어는 주어지지 않는다.

마지막 입력은 0이 주어진다.

 

 

출력

각 줄에 각 테스트케이스에서 사전상 가장 앞서는 단어를 출력한다.

 

 

 

통과한 답안

namespace _2204
{
    internal class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                int n = int.Parse(Console.ReadLine());

                if (n == 0)
                {
                    return;
                }

                string[] words = new string[n];

                for (int i = 0; i < n; i++)
                {
                    words[i] = Console.ReadLine();
                }

                var wordsIdx = words.Select((value, index) => new { Value = value.ToLower(), Index = index })
                                       .OrderBy(x => x.Value)
                                       .ToList();

                Console.WriteLine(words[wordsIdx[0].Index]);
            }
        }
    }
}


대소문자가 섞여있는 영어 알파벳을 정렬하여 가장 처음에 나오는 단어를 출력하는 문제이다.

 

이 문제는 정렬을 이용하는 문제로

단어 자체는 변경하지 않고 정렬해야되는 것이 포인트이다.

이를 해결하기 위해 인덱스를 알려줄 list를 아래와 같이 구현하였다.

var wordsIdx = words.Select((value, index) => new { Value = value.ToLower(), Index = index })
                    .OrderBy(x => x.Value)
                    .ToList();

 

words로 받아온 단어들의 값과 인덱스를 받아와서

단어를 소문자로 모두 고친 후에 오름차순으로 정렬한다.

 

Console.WriteLine(words[wordsIdx[0].Index]);

 

위와 같이 wordsIdx[0]에 있는 인덱스를

words의 인덱스 부분에 넣어줌으로써 문제를 해결하였다.