코딩테스트
[프로그래머스] 자바(Java) - 가장 큰 수
수방방
2024. 7. 5. 16:17
🧩 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42746
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 주어진 정수 배열의 숫자들을 조합하여 가장 큰 수를 만드는 문제
- 숫자를 문자열로 변환한 후 특정 기준에 따라 정렬하여 최종 결과를 얻는다.
💡 알고리즘 설계
- 숫자 배열을 문자열 배열로 변환합니다.
- 숫자 배열을 문자열 배열로 변환해야 하는 이유는 숫자들을 단순히 숫자로 비교하는 것이 아닌, 숫자를 이어붙였을 때의 크기를 비교해야 하기 때문입니다.
- ex) "9" > "330" : 문자열의 비교는 사전식 비교이기 때문에 각 문자의 유니코드 값을 왼쪽부터 오른쪽으로 하나씩 비교하여 순서를 결정
- 문자열로 변환한 배열을 정렬합니다.
- 두 문자열을 이어붙여서 비교하는 방식으로 정렬합니다.
- 정렬된 배열을 String으로 이어붙여서 최종 결과를 반환합니다.
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String[] strArr = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
strArr[i] = Integer.toString(numbers[i]);
}
Arrays.sort(strArr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
if(strArr[0].equals("0")) return "0";
return String.join("", strArr);
}
}
- int[] numbers 배열의 요소를 String으로 변환합니다.
- `Integer.toString()` 메서드를 사용해 String 으로 변환
- `Arrays.sort(strArr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2))`를 사용하여 문자열 배열을 정렬합니다.
- 두 문자열 o1과 o2를 이어붙여서 (o2 + o1)와 (o1 + o2)를 비교하여 더 큰 값을 선택합니다.
- 정렬된 배열을 String으로 합쳐서 반환합니다.
- `String.join()`을 사용하여 배열의 값을 하나의 문자열로 합침
📍 처음 작성한 틀린 코드와 틀린 이유
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String[] strArr = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
strArr[i] = Integer.toString(numbers[i]);
}
Arrays.sort(strArr, Collections.reverseOrder());
return String.join("", strArr);
}
}
- 이 코드는 `Collections.reverseOrder()`를 사용하여 문자열을 단순히 내림차순으로 정렬합니다.
- [3, 30, 34, 5, 9] 배열을 예를 들자면
- 문자열로 변환 : [ "3", "30", "34", "5", "9" ]
- `Collections.reverseOrder()`를 사용하여 정렬 : [ "9", "5", "34", "30", "3" ]
- 문자열로 join : "9534303"
- -> 하지만 이 배열에서 가장 큰 수는 "9534330"로 조합할 수 있다.
- [3, 30, 34, 5, 9] 배열을 예를 들자면
- 즉, 이 코드는 각 숫자의 조합이 가장 큰 수를 만드는데 필요한 정렬 기준을 충족하지 못합니다.
🧠 배운 점
- 문자열 비교의 중요성
- 숫자를 문자열로 변환하여 비교하는 경우, 단순한 숫자 비교와는 다른 결과를 얻을 수 있습니다.
- 예를 들어, 숫자 3과 30을 비교할 때, 숫자로는 3 < 30이지만 문자열로는 "3"이 "30"보다 앞에 옵니다. 따라서 문자열 비교를 통해 더 큰 수를 만들 수 있는 방법을 배웠습니다.
- 정렬에 대하여
- Java의 `Arrays.sort()` 메소드를 활용하여 람다 표현식으로 커스텀 정렬 기준을 설정하는 방법을 이해했습니다.
- 문자열 합치기와 String.join()의 사용
- 배열의 요소를 하나의 문자열로 합치는 방법을 배웠습니다.
- `String.join()` 메소드를 사용하면 배열의 요소를 간편하게 하나의 문자열로 합칠 수 있습니다.