알고리즘 문제 풀이/백준

[백준 10989번/C#] 수 정렬하기

Ardmos :) 2023. 10. 24. 17:41

배운 점:

  1. C#에서의 출력 속도 빠른 순서 :

        1. StreamWriter

        2. StringBuilder 사용 후 Console.Write

        3. Console.WriteLine 

 

실수한 점:

  1. List를 사용해서 메모리 초과가 일어났다.

 

 

// List 사용  버전 (메모리 초과)

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 정수 n 입력 받기
            int n = int.Parse(Console.ReadLine());
            int answer = 0;
            List<int> list = new List<int>();

            // 입력받을 숫자의 개수 n 입력 받기
            for (int i = 0; i < n; i++)
            {
                list.Add(int.Parse(Console.ReadLine()));
            }

            // 오름차순 정렬
            list.Sort();


            // Console.WriteLine()을 쓰면 시간초과가 나서, 더 빠른 StreamWriter를 사용해 출력한다 
            using (var print = new System.IO.StreamWriter(Console.OpenStandardOutput()))
            {
                // 결과 출력
                foreach (int i in list)
                {
                    answer = i;
                    print.WriteLine(answer);
                }
            }
        }
    }
}

 

// 정답 통과버전

using System;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 입력받을 숫자의 개수 n 입력 받기
            int n = int.Parse(Console.ReadLine());
            int answer = 0;
            int MAX_NUM = 10000;
            // 주어질 숫자는 1~10000 까지의 자연수. 이 배열의 index는 곧 주어진 숫자.
            int[] totalNumArray = new int[MAX_NUM+1];


            // 주어진 숫자가 각각 몇 개씩 있는지 array에 카운팅. 
            // 배열을 읽을 때 1부터 읽으면 따로 오름차순정렬 과정이 필요 없어짐. 
            for (int i = 0; i < n; i++)
            {
                totalNumArray[int.Parse(Console.ReadLine())]++;
            }

            // Console.WriteLine()을 쓰면 시간초과가 나서, 더 빠른 StreamWriter를 사용해 출력한다 
            using (var print = new System.IO.StreamWriter(Console.OpenStandardOutput()))
            {
                for (int targetNum = 0; targetNum <= MAX_NUM; targetNum++)
                {
                    // 해당 자연수의 값이 0이면 예제에서 주어지지 않았다는 이야기. 무시 가능. 
                    if (totalNumArray[targetNum] == 0) continue;

                    // 0이 아니라면 입력받은 횟수만큼 출력
                    for (int j = 0; j < totalNumArray[targetNum]; j++)
                    {
                        answer = targetNum;
                        print.WriteLine(answer);
                    }
                }
            }
        }
    }
}

 

*참고

https://kplee.tistory.com/77

 

C# 백준 문제 번호 10989 - 수 정렬하기 3

문제 N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는

kplee.tistory.com

https://www.acmicpc.net/blog/view/57

 

출력 속도 비교

여러가지 언어와 출력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 총 N개의 줄에 1부터 10,000,000까지의 자연수를 한 줄에 하나씩 출력하는 시간을 측정. 10번 측정해서 평

www.acmicpc.net

 

728x90