코딩테스트에서는 정렬 조건이 하나 더 붙는 순간 풀이가 복잡해집니다. “특정 인덱스를 기준으로 정렬하고, 같으면 사전순으로 정렬하라”가 대표적입니다. C#에서 이런 다중 정렬(Multi-Level Sorting)을 처리하는 방법을 정리해 보겠습니다.
문제
문자열 배열 words와 정수 k가 주어진다.
다음 규칙에 따라 배열을 정렬하라:
- 각 문자열의
k번째 문자를 기준으로 오름차순 정렬합니다. - 만약 해당 문자가 같은 경우, 문자열 전체를 기준으로 사전순 정렬합니다.
핵심 포인트
정렬 기준이 하나가 아니다.
- 1차 기준: k번째 문자
- 2차 기준: 문자열 전체
하나의 기준으로 끝나는 정렬이 아니라 다중 정렬 문제다.
예시
입력
words = ["sun", "bed", "car"]
k = 1
출력
["car", "bed", "sun"]
입력
words = ["abce", "abcd", "cdx"]
k = 2
출력
["abcd", "abce", "cdx"]
방법 1: Array.Sort + 비교 함수
정렬의 내부 동작을 직접 제어하는 방법입니다. Array.Sort 메서드에 커스텀 비교 함수를 전달해 원하는 정렬 기준을 구현합니다.
public string[] solution(string[] words, int k)
{
Array.Sort(words, (a, b) =>
{
if (a[k] == b[k])
return a.CompareTo(b); // 2차 정렬
return a[k].CompareTo(b[k]); // 1차 정렬
});
return words;
}
이 비교 함수는 두 값을 비교해서 누가 앞에 와야 하는지를 결정합니다.
- 먼저 k번째 문자를 비교하고
- 같으면 문자열 전체를 비교한다 (
CompareTo)
즉, 조건 분기를 통해 다중 정렬을 직접 구현한 것입니다.
CompareTo 이해하기
a.CompareTo(b)
- 음수:
a가 앞 - 0: 동일
- 양수:
b가 앞
문자열에 적용하면 사전순 비교를 수행합니다.
방법 2: LINQ OrderBy
위 방법보다 가독성이 좋아 실수를 줄이기 쉽습니다. LINQ의 OrderBy와 ThenBy를 활용하면 정렬 기준이 명확하게 드러난다.
using System.Linq;
public string[] solution(string[] words, int k)
{
return words
.OrderBy(w => w[k]) // 1차 정렬
.ThenBy(w => w) // 2차 정렬
.ToArray();
}
OrderBy로 첫 번째 기준을 정렬하고 나서 값이 같으면 ThenBy로 두 번째 기준을 적용합니다. LINQ에서는 이렇게 정렬 기준을 “순서대로 선언”해서 다중 정렬을 구현합니다.
ThenBy를 여러 번 사용해서 3차, 4차 기준까지도 쉽게 추가할 수 있습니다.
var result = users
.OrderBy(u => u.Age)
.ThenBy(u => u.Name)
.ThenBy(u => u.Score);
기본은 오름차순 정렬이지만 내림차순이 필요하다면 OrderByDescending과 ThenByDescending을 사용합니다.
var result = users
.OrderByDescending(u => u.Age)
.ThenByDescending(u => u.Name);