paraworld   3년 전

어떻게 해야 시간초과를 피할 수 있을지 모르겠습니다.

제가 정렬을 비효율적으로 한건지, 아니면 언어 자체의 한계인지 궁금합니다.

구글링해보니, c++은 내장 정렬함수 쓰면 끝이더라고요.

퀵정렬 (시간초과)

using System;
using System.Collections.Generic;
using System.Text;

// CapitalLetters for class names and methods, camelCase for variable names.
// Write your code clearly enough so that it doesn't need to be commented, or at least, so that it rarely needs to be commented.

namespace Testpad
{
    public class BaekJoon15688
    {
        static void Main()
        {
            StringBuilder sb = new StringBuilder();

            int n = int.Parse(Console.ReadLine()); // 주어지는 수의 개수

            List<int> numbers = new List<int>(); // 수열

            // 주어지는 수열을 받음
            for (int i = 0; i < n; i++)
            {
                numbers.Add(int.Parse(Console.ReadLine()));
            }

            numbers.Sort();

            foreach (var item in numbers)
            {
                sb.AppendLine(item.ToString());
            }

            // 정렬한 결과 출력
            Console.Write(sb.ToString());
        }
    }
}

카운팅 정렬 (시간초과)

이 문제의 경우 수의 범위가 2백만이니, 충분히 빠를 거라 생각했는데 시간초과

using System;
using System.Text;

// CapitalLetters for class names and methods, camelCase for variable names.
// Write your code clearly enough so that it doesn't need to be commented, or at least, so that it rarely needs to be commented.

namespace Testpad
{
    public class BaekJoon15688
    {
        static void Main()
        {
            StringBuilder sb = new StringBuilder();

            int n = int.Parse(Console.ReadLine()); // 주어지는 수의 개수

            int[] negative_Numbers = new int[1000001]; // -1000000이 1000000번 인덱스
            int[] positive_Numbers = new int[1000001]; // 0이 0번, 1000000이 마지막 인덱스

            // 주어지는 수열을 받음
            for (int i = 0; i < n; i++)
            {
                // 수가 음수일 수 있으니, 분류함
                int thisNumber = int.Parse(Console.ReadLine());

                if (thisNumber >= 0)
                {
                    positive_Numbers[thisNumber]++;
                }
                else
                {
                    negative_Numbers[Math.Abs(thisNumber)]++;
                }
            }

            // 음수
            for (int i = 1000000; i >= 0; i--)
            {
                for (int j = 0; j < negative_Numbers[i]; j++)
                {
                    sb.AppendLine($"-{i}");
                }
            }

            // 양수
            for (int i = 0; i <= 1000000; i++)
            {
                for (int j = 0; j < positive_Numbers[i]; j++)
                {
                    sb.AppendLine(i.ToString());
                }
            }

            // 정렬한 결과 출력
            Console.Write(sb.ToString());
        }
    }
}

wogus23   3년 전

 countingSort를 잘못구현했다고 말은 못하지만 저는 map,sort,priorityQueue,countingSort 이렇게 다 해봤는데 countingSort가 가장 빨랐어요

paraworld   3년 전

그냥 언어의 문제인 것 같네요.

댓글을 작성하려면 로그인해야 합니다.