백준 알고리즘/Lang-C#

[백준/C# (.NET)] 1181번 단어정렬

Jongung 2021. 8. 11. 20:22

 

백준 온라인 저지 / 1181 단어 정렬

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

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 

  • 사용언어 : C# (.NET)
  • 알고리즘 : 정렬

 

 

 

 

C#코드

1. 문제 정리

 

이번 문제는 전형적인 정렬 문제입니다. 

첫 접근은 일단 리스트와 정렬 함수를 통해 단어의 길이가 짧은 것 부터 출력하고 

만약 길이가 같다면 사전순으로 정렬하는 것이라네요 네..

 

일단 20000개를 입력 받고 문자열의 길이는 50개를 넘는다고 하지 않으니

다른 무언가를 사용하지 않고 풀 수 있겠다는 생각이 들었다만....

 

2. Linq

 

링크의 대한 정의 및 문서는 여기를 클릭해주세요

 

우린 linq에서 ordered by를 사용할 것입니다.

 

slist = slist.OrderBy(x => x.Length).ToList();

 

링크에서 orderedby는 기본 값이 ascending 즉 오름차순이라는 기본 값을 가지고 있습니다.

뒤에 리스트 안에서 오름차순이라고 정해줬죠?

 

 

사실 그냥 system 안에 있는 sort로도 구현 할 수 있지만 편하니깐? 쓴다고 칩시다. ㅋㅋㅋ

 

for (int i = 0; i < cnt; i++)
            {
                string word = Console.ReadLine();
                slist.Add(word.ToLower());
            }

            slist = slist.Distinct().ToList();

 

또 링크 안에 distinct를 사용하는데 이 함수는 c#뿐만 아니고 다른 언어에서도 중복된 데이터를 삭제한다는 의미를 가지고 있습니다.

 

for문에서 중복되는 값이 생성 되었을 때 중복된 값을 없애주는거죠

 

 

3. 코드 작성

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace boj
{
    class Program
    {
        static void Main(string[] args)
        {
            int cnt = int.Parse(Console.ReadLine());

            List<string> slist = new List<string>();


            for (int i = 0; i < cnt; i++)
            {
                string word = Console.ReadLine();
                slist.Add(word.ToLower());
            }

            slist = slist.Distinct().ToList();
            slist.Sort();
            slist = slist.OrderBy(x => x.Length).ToList();

            foreach (string ans in slist)
            {
                Console.WriteLine(ans);
            }
        }
    }
}