
https://www.acmicpc.net/problem/1181
오늘은 백준 1181번 문제를 C#으로 풀어보았다.
문제의 핵심은 다음과 같다:
입력으로 주어진 단어들을 다음 기준에 따라 정렬하는 문제다.
길이가 짧은 순으로 정렬
길이가 같으면 사전 순으로 정렬
중복된 단어는 제거
처음에는 입력된 단어를 배열에 저장하고, 직접 정렬을 구현하려고 했다.
길이만 비교해서 버블 정렬 비슷하게 돌렸는데, 테스트케이스에서 순서가 계속 꼬였다.
while (count < input)
{
for (int i = 0; i < output.Length - 1; i++)
{
if (output[i].Length > output[i + 1].Length)
{
// Swap
string temp = output[i];
output[i] = output[i + 1];
output[i + 1] = temp;
}
}
count++;
}
여기서의 문제는:
길이만 비교하고 사전순 비교가 빠졌고
버블 정렬을 정확하게 구현하지도 않았으며
중복 제거 후 배열 길이와 비교 횟수가 어긋남
결국 C#의 LINQ를 활용해서 훨씬 간단하고 정확하게 해결할 수 있었다.
using System;
using System.Linq;
namespace backjoon
{
internal class Program
{
static void Main()
{
int n = int.Parse(Console.ReadLine());
string[] words = new string[n];
for (int i = 0; i < n; i++)
{
words[i] = Console.ReadLine();
}
var result = words
.Distinct()
.OrderBy(word => word.Length)
.ThenBy(word => word);
foreach (var word in result)
{
Console.WriteLine(word);
}
}
}
}
직접 정렬 알고리즘을 구현하는 것도 좋지만, 조건이 여러 개일 때는 OrderBy와 ThenBy 조합이 훨씬 깔끔하다.
Distinct()로 중복 제거도 쉽게 할 수 있다.
LINQ는 익숙해질수록 문제 해결에 큰 도움이 된다.
다음에는 조건이 더 복잡한 정렬 문제도 LINQ로 도전해봐야겠다.