문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

이 문제는 입력받는 수의 개수 N과 메모리 제한이 핵심인 듯하다

 

처음엔 입력받은 수를 배열에 다 저장한 후에 정렬을 시도했는데 

 

최대 10,000,000 개의 수를 입력받으니 당연하게도 메모리 제한에 걸렸고

 

입력받는 최대 숫자가 10,000인 거에 힌트를 얻어서 따로 정렬하지 않고 출력하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Collections.Generic;
using System.Text; 
class Program
{
    static void Main(string[] args)
    {
            //입력 받을 수의 갯수
            int N = int.Parse(Console.ReadLine());
 
            int MAX_NUM = 10000//입력 받는 수의 최대 값
            int[] countArray = new int[MAX_NUM + 1]; //입력 받은 수 카운트 할 배열
 
             //입력 받은 수를 카운팅
            int temp = 0;
            for(int i = 0; i < N; i++)
            {
                temp = int.Parse(Console.ReadLine());
                countArray[temp]++;
            }
 
           using (var print = new System.IO.StreamWriter(Console.OpenStandardOutput()))
           {
             //카운팅 된 숫자를 출력
             for(int i = 0; i <= MAX_NUM; i++)
             {
                if (countArray[i] == 0continue;
 
                for(int j = 0; j < countArray[i]; j++)
                {
                    print.WriteLine(i);
                }          
             }
           }
 
    }
}
cs

 

배열 문제를 해결하고도 메모리 제한, 시간 초과로 계속 실패했는데 

 

출력 방식이 문제였다. 보통은 StringBuilder를 사용하면 거의 해결이 되었는데 이번 경우엔 그것 조차 안되어서 

 

C#으로 가능한가? 싶었지만 방법은 있었다. 위의 소스처럼 StreamWriter를 사용하면 해결이 가능하다.

 

참고한 출력 속도 비교 자료 

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

 

출력 속도 비교

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

www.acmicpc.net

 

 

10989 문제 링크

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

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

+ Recent posts