이번 강좌에서는 코딩 테스트에서 자주 출제되는 문제 중 하나인 ‘수를 묶어서 최댓값 만들기’ 문제를 다룰 것입니다. 이 문제는 주어진 수들을 조합하여 가능한 최대의 수를 만드는 과정을 다룹니다. 그리고, 이를 C# 언어를 통해 해결하는 방법을 단계별로 설명하겠습니다.
문제 설명
여러 개의 양의 정수들이 주어질 때, 이 숫자들을 조합해서 만들 수 있는 가장 큰 수를 반환하는 함수를 작성하시오. 예를 들어, 주어진 숫자들이 [3, 30, 34, 5, 9]라면, 이들을 적절히 조합하여 만들 수 있는 가장 큰 수는 9534330입니다.
입력 형식
하나의 정수 배열 numbers
가 주어집니다. 배열의 크기는 0 이상 100 이하이며, 각 숫자의 길이는 1 이상 10 이하입니다.
출력 형식
모든 숫자를 조합하여 만든 가장 큰 수를 문자열 형태로 반환합니다.
문제 접근법
이 문제를 해결하기 위해서는 몇 가지 접근 방식이 필요합니다.
- 정렬: 주어진 숫자들을 정렬하여 가장 큰 수를 만들어야 합니다. 정렬 기준이 중요하며, 각 숫자를 문자열로 보고 적용할 규칙을 만들어야 합니다.
- 문자열 비교: 두 숫자를 비교할 때, 각각의 숫자가 먼저 오는 경우와 뒤에 오는 경우를 조합하여 누가 더 큰 수가 될지를 판단해야 합니다.
코드 구현
위의 접근법에 따라서 C#으로 문제를 해결하는 코드를 작성해 보겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
public static string Solution(int[] numbers)
{
// 숫자를 문자열로 변환합니다.
string[] strNumbers = numbers.Select(n => n.ToString()).ToArray();
// 문자열 배열을 정렬합니다.
Array.Sort(strNumbers, (x, y) => (y + x).CompareTo(x + y));
// 정렬된 배열을 하나의 문자열로 결합합니다.
string result = string.Join("", strNumbers);
// 만약 결과가 "0"으로 시작하면 0만 반환합니다.
return result[0] == '0' ? "0" : result;
}
static void Main(string[] args)
{
int[] numbers = { 3, 30, 34, 5, 9 };
string answer = Solution(numbers);
Console.WriteLine(answer); // 9534330
}
}
코드 설명
위 코드를 좀 더 자세히 살펴보겠습니다.
- 문자열 변환: 우선 각 숫자를 문자열로 변환한 후
strNumbers
라는 배열에 저장합니다. 이는 숫자들을 문자열 형태로 재배열하기 위해 필요합니다. - 정렬:
Array.Sort
메서드를 사용하여strNumbers
배열을 정렬합니다. 이때, 정렬 기준으로는 두 숫자x
와y
를 결합하여 큰 순서대로 정렬합니다.(y + x)
와(x + y)
를 비교하는 방식으로, 어떤 조합이 큰지를 판단합니다. - 결과 결합: 정렬된 숫자들을
string.Join
을 사용하여 하나의 문자열로 결합합니다. - 최종 확인: 만약 결과 문자열의 첫 번째 문자가 ‘0’이라면 모든 숫자가 0인 경우이므로 ‘0’만 반환합니다.
복잡도 분석
이 알고리즘의 시간 복잡도는 O(N log N)입니다. 이는 주어진 숫자 배열을 정렬하는 과정에 소비되는 시간입니다. N은 숫자의 개수를 나타냅니다. 공간 복잡도는 O(N)으로 각 숫자를 문자열로 변환하여 저장하는 배열을 필요로 합니다.
결론
이번 강좌에서는 C#으로 ‘수를 묶어서 최댓값 만들기’ 문제를 해결하는 방법을 살펴보았습니다. 알고리즘 문제를 해결하기 위해서는 문제를 잘 이해하고, 적절한 자료구조와 알고리즘을 선택하는 것이 중요합니다. 다양한 문제를 통해 연습하세요!
추가 연습 문제
여기서 더 나아가 다음의 문제들을 추가로 연습해보는 것을 권장합니다.
- 주어진 숫자들을 조합하여 가능한 모든 경우의 수를 만들고, 그 중 최대값을 찾아보세요.
- 양수 및 음수를 혼합하여 주었을 때, 최댓값을 만드는 알고리즘을 작성해보세요.
- 입력 배열의 크기가 매우 커질 경우, 성능 저하를 방지하기 위한 방법을 모색해 보세요.
참고 자료
이와 같은 알고리즘 문제를 푸는 데는 여러 참고 자료들이 도움이 됩니다. 다음 링크들을 참조해보세요: