본문 바로가기
Development/Baekjoon

[C#] 1427번: 소트인사이드

by Mobics 2025. 10. 20.

목차


    백준 단계별로 풀어보기

    25.10.20

    13단계: 정렬


    1427번: 소트인사이드

    문제 링크 : https://www.acmicpc.net/problem/1427

     

    문제 풀이

    : StreamReader, StreamWriter를 활용하여 입출력 처리 속도를 높였으며, 계수 정렬 방식을 활용하여 내림차순으로 정렬하였다.

    1. StreamReader와 StreamWriter를 사용하기 위해 System.IO 를 선언하고, 각각 sr, sw로 만든다.
    2. StreamReader를 통해 입력값을 받아 문자열 input 에 담고, 내림차순으로 정렬된 수를 담을 int형 배열 arr 를 초기화하고, 0부터 9까지 입력값에 대해 개수를 담을 int형 배열 count 를 초기화한다.
    3. for 반복문을 통해 문자열 input 에 대하여 각 문자값에 대응하는 위치(index)의 개수를 증가시킨다.
      •     이때, input[i] 값은 char 타입이기 때문에 그대로 index로 활용했다가는 아스키 코드에 따라 해당하는 문자에 대응하는 int값으로 들어간다. --> 아스키 코드 표에 따라 input[i]에서 '0' 즉, 48을 빼주면 각 숫자로 변환된다.
    4. index를 담을 변수를 초기화하고, for 반복문을 통해 9부터 0까지 (내림차순) 반복하며 count 에 담긴 개수만큼 arr 에 담는다.
    5. foreach 문을 통해 내림차순으로 정렬된 배열 arr 를 StreamWriter를 통해 줄바꿈 없이 출력한다.

    ※ 참고

    >> 문자열의 문자값을 index로 활용할 때, 해결법 2가지

    1. 문자값을 아스키 코드에 따라 적절한 값으로 빼서 해결 : 가장 빠르고 효율적이다.
    2. 문자값을 일일이 int.Parse()를 통해 int값으로 변환하여 해결 : 직관적이라는 장점이 있지만, 변환 비용이 있다.
    for (int i = 0; i < input.Length; i++)
    {
        int temp = int.Parse(input[i].ToString());
        count[temp]++;
    }

    --> 2번 방식의 코드

     

    → 직관적인 것이 중요하다면 2번 방식을 사용했겠지만, 문제를 풀 땐 효율이 더 중요하다고 생각해서 1번 방식을 사용했다.

     

     

    >> 아스키 코드 표

    출처 : https://sheepone.tistory.com/47

     

    정답 코드

    using System.IO;
    
    class Backjoon
    {
        static void Main(string[] args)
        {
            using var sr = new StreamReader(Console.OpenStandardInput());
            using var sw = new StreamWriter(Console.OpenStandardOutput());
            string input = sr.ReadLine();
            int[] arr = new int[input.Length];
            int[] count = new int[10];
    
            for (int i = 0; i < input.Length; i++)
            {
                count[input[i] - '0']++;
            }
    
            int index = 0;
            for (int i = 9; i >= 0; i--)
            {
                while (count[i] > 0)
                {
                    arr[index++] = i;
                    count[i]--;
                }
            }
    
            foreach (var t in arr)
            {
                sw.Write(t);
            }
        }
    }

    'Development > Baekjoon' 카테고리의 다른 글

    [C#] 11651번: 좌표 정렬하기 2  (0) 2025.10.24
    [C#] 11650번: 좌표 정렬하기  (0) 2025.10.23
    [C#] 10989번: 수 정렬하기 3  (0) 2025.10.19
    [C#] 2751번: 수 정렬하기 2  (0) 2025.10.18
    [C#] 25305번: 커트라인  (0) 2025.10.17