코딩테스트
10989번 수 정렬하기 3, 1427번 소트 인사이드
Cadi
2025. 1. 30. 00:08
코딩테스트 : 10989번 수 정렬하기 3
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하고 출력하면 되었다.