코딩테스트

10989번 수 정렬하기 3, 1427번 소트 인사이드

Cadi 2025. 1. 30. 00:08

코딩테스트 :  10989번 수 정렬하기 3

시간 제한메모리 제한제출정답맞힌 사람정답 비율
5 초 (하단 참고) 8 MB (하단 참고) 332765 79927 61019 23.892%

문제

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

입력

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

출력

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

using System;
using System.Text;

public class Program
{
    public static void Main()
    {
        int n = int.Parse(Console.ReadLine());

        // -1,000,000 ~ 1,000,000을 처리하기 위한 배열
        int[] arr = new int[n];
        // 입력 값을 Counting 배열에 기록
        for (int i = 0; i < n; i++)
        {
            int s = int.Parse(Console.ReadLine());
            arr[i] = s;
        }

        // StringBuilder로 출력 최적화
        StringBuilder sb = new StringBuilder();
        Array.Sort(arr);

        // Counting 배열을 순회하며 값 추가
        for (int i = 0; i < n; i++)
        {

            sb.AppendLine(arr[i].ToString());
        }

        // 한 번에 출력
        Console.Write(sb.ToString());
    }
}

 

 

메모리 초과가 떴다. 메모리 초과는 또 처음이다. 

 

using System;
using System.Text;

public class Program
{
    public static void Main()
    {
        int n = int.Parse(Console.ReadLine());

        int[] arr = new int[10001];
        // 입력 값을 Counting 배열에 기록
        for (int i = 0; i < n; i++)
        {
            int s = int.Parse(Console.ReadLine());
            arr[s]++;
        }
        // StringBuilder로 출력 최적화
        for (int i = 0; i < n; i++)
        {
            while (arr[i] > 0)
            {
                Console.WriteLine(i);
                arr[i]--;
            }
            
        }
    
    }
}

 

 

using System;
using System.Text;

public class Program
{
    public static void Main()
    {
        int n = int.Parse(Console.ReadLine());

        int[] arr = new int[10001];
        // 입력 값을 Counting 배열에 기록
        for (int i = 0; i < n; i++)
        {
            int s = int.Parse(Console.ReadLine());
            arr[s]++;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.Length; i++)
        {
            while (arr[i] > 0)
            {
                sb.AppendLine(i.ToString());
                arr[i]--;
            }
        }
        Console.WriteLine(sb);
    }
}

 

 

using System;
using System.Text;

public class Program
{
    public static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

        int[] arr = new int[10001];
        // 입력 값을 Counting 배열에 기록
        for (int i = 0; i < n; i++)
        {
            int s = int.Parse(Console.ReadLine());
            arr[s]++;
        }
        for (int i = 0; i < arr.Length; i++)
        {
            while (arr[i] > 0)
            {
                sw.WriteLine(i);
                arr[i]--;
            }
        }
        sw.Flush();
    }
}

이걸로 통과 ! 

메모리와 시간을 둘 다 신경써야 하는 부분이었다.  

지난 번에 썼던 StringBuilder는 시간을 줄이기 위해서 메모리 효율성을 어느정도 포기한 것이기 때문에 다른 방법을 사용해야 했다. 그래서 찾아본 방법이 StreamWirter라는 것이다. StringBuilder가 문자열을 계속해서 더해서 한 번에 출력하는 것이라면, 이건 조금 다른 개념으로 StringBuilder가 Heap 공간에 메모리를 모아뒀다가 출력한다면 StreamWirter는 일정 크기만큼 모아두고, 자동으로 출력하며 메모리를 비우는 개념이다. 

 

c#에게 얶가가 조금 있는 듯 하다. 

 

 

 

 

 

 

 

코딩테스트 :  1427번 소트 인사이드

문제

배열을 정렬하는 것은 쉽다. 수가 주어지면, 그 수의 각 자리수를 내림차순으로 정렬해보자.

입력

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 자리수를 내림차순으로 정렬한 수를 출력한다.

using System;
using System.Text;

public class Program
{
    public static void Main()
    {
        string input = Console.ReadLine();
        int number = int.Parse(input);
        
        int[] array = new int[input.Length];

        for (int i = 0; i < input.Length; i++)
        {
           int remain = number % 10;
           number = number / 10;
           
           array[i] = remain;
        }
        Array.Sort(array);
        Array.Reverse(array);

        for (int i = 0; i < array.Length; i++)
        {
            Console.Write(array[i]);
        }

            
    }
}

분명 저번문제보다 난이도가 높지만 훨씬 쉬운 문제였다. 

다른 사람의 흥미로운 풀이

 

굳이 하나하나씩 나눌 필요 없이, String에 있는 문자들을 char형태로 저장한 후 , Sort - Reverse하고 출력하면 되었다.