코딩테스트/백준

[10989] 수 정렬하기3(C#)

봉두두 2022. 3. 30. 22:12
728x90

10,000보다 작거나 같은 수를 최대 천만번 input을 받아서 정렬하는 문제로

Sorting과 관련한 내장함수로는 통과 조건을 만족할 수 없다.

천만번 input을 받는 대신에 그 값의 범위가 좁은 편이기 때문에

이럴때는 계수정렬 알고리즘을 활용한다.

 

계수정렬(Counting Sort)?
배열의 인덱스를 특정한 데이터의 값으로 여기는 정렬 방법
배열의 크기는 데이터의 범위를 포함할 수 있도록 설정하고 각 배열의 값으로는 데이터가 등장한 횟수를 세어 입력
시간복잡도 : O(N)
int N = int.Parse(Console.ReadLine());
int[] arrInt = new int[10001];

for (int i = 0; i < N; i++)
{
    int intThisInput = int.Parse(Console.ReadLine());
    arrInt[intThisInput] += 1;
}

for (int i = 0; i < arrInt.Length; i++)
{
    if (arrInt[i] == 0)
        continue;
    for (int j = 0; j < arrInt[i]; j++)
        Console.WriteLine(i);
    
    // 아래와 같이 Enumerable.Repeat(count, string) 수행 시 
    // string을 count만큼 반복하는 IEnumerable<T out>을 return한다.
    // Console.WriteLine(String.Join("\n", Enumerable.Repeat(i, arrInt[i]).ToArray()));
}

Enumerable 적용 시 메모리초과 에러..

단순 for문 수행 시 시간초과 에러...

그래서 결론은 아직 완전한 해답을 모른다ㅠㅠ

728x90
728x90

'코딩테스트 > 백준' 카테고리의 다른 글

[1459] 걷기(C#)  (0) 2022.05.18
[1333] 부재중 전화(C#)  (0) 2022.05.06
[2748] 피보나치 수 2(C#)  (0) 2022.04.07
[18014] 나이순 정렬(C#)  (0) 2022.03.30
[2750] 수 정렬하기(C#)  (0) 2022.03.30