🧠 [프로그래머스 Lv2] 가장 큰 수
✅ 문제 개요
목표: 주어진 숫자 배열을 이어붙여 만들 수 있는 가장 큰 수를 문자열로 반환
입력: int[] numbers – 0 이상 양의 정수들
출력: 가장 큰 수를 문자열 형태로 반환
🔍 핵심 아이디어:
커스텀 정렬
정렬 기준
숫자 a, b를 문자열로 변환한 후
a + b와 b + a 중 더 큰 쪽이 앞에 오도록 정렬
예시: a = "3", b = "30"
- "330" vs "303"
→ "330"이 더 크므로 "3"이 앞에 와야 함🧩 풀이 순서
int[] → String[] 으로 변환
정렬 기준: (s1 + s2).compareTo(s2 + s1)을 내림차순으로
정렬된 문자열들을 이어붙이기
예외 처리: 결과가 "000..."인 경우 "0" 반환
💻 자바 예시 코드
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String[] nums = new String[numbers.length];
// 1. 숫자를 문자열로 변환
for (int i = 0; i < numbers.length; i++) {
nums[i] = String.valueOf(numbers[i]);
}
// 2. 정렬 기준: (a + b) vs (b + a)
Arrays.sort(nums, (a, b) -> (b + a).compareTo(a + b));
// 3. 모두 0인 경우 처리
if (nums[0].equals("0")) {
return "0";
}
// 4. 정렬된 문자열 이어붙이기
StringBuilder sb = new StringBuilder();
for (String s : nums) {
sb.append(s);
}
return sb.toString();
}
}⚠️ 주의할 점
| 항목 | 설명 |
|---|---|
| a + b vs b + a | 일반적인 숫자 정렬이 아니라 문자열 붙여서 비교 |
| Arrays.sort() 정렬 기준 | 내림차순이어야 큰 수가 앞에 오도록 정렬됨 |
| 결과가 "0000" 등일 때 | "0" 하나만 출력해야 함 (if (nums[0].equals("0"))) |
| 문자열 비교 | (b + a).compareTo(a + b) — 큰 쪽이 먼저 오도록 |
🧠 이 문제를 통해 키운 사고력
📌 정렬 기준을 스스로 정의하는 능력
📌 문자열 비교 vs 숫자 비교의 차이 이해
📌 그리디적 판단: 매 순간 가장 큰 숫자를 앞에 놓는 게 전체 최적
'[코딩테스트]' 카테고리의 다른 글
| 조이스틱 - 프로그래머스(java) (0) | 2025.05.05 |
|---|---|
| 파일명 정렬 - 프로그래머스 - java (0) | 2025.05.05 |
| 과일 장수 - 프로그래머스 - java (0) | 2025.05.05 |
| K번째수 - 프로그래머스 (java) (0) | 2025.05.05 |
| 두 개 뽑아서 더하기 (프로그래머스 Lv1) - java (0) | 2025.05.05 |