Algorithm
[Algorithm] 프로그래머스 정렬 - 가장 큰 수
pearhyunjin
2024. 3. 10. 20:44
프로그래머스 알고리즘 고득점 kit 정렬 문제를 정리한 내용입니다.
문제 : Lv.2 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
기능과 구현
- 숫자가 아닌 문자열을 더한 값을 구해야 하기 때문에 numbers 배열의 값을 String으로 변환하여 새로운 String 배열을 만들어준다.
String.valueOf(int a) 또는 Integer.toString(int a)를 사용해 int 타입을 String 타입으로 변경시켜준다.
- Arrays.sort() 메서드를 통해서 정렬해준다.
첫번째 매개변수는 정렬해줄 배열 객체이고 두번째 매개변수는 Comparator(정렬 기준이 저장됨)이다. - 문제에서 비교하고자 하는것이 일반적인 수의 오름/내림차순으로의 정렬 값이 아니기 때문에 직접 Comparator를 생성해 이용한다.
문자열 자체로 결과를 비교하는 방식으로 구현한다. 입력된 두 문자열을 더하는 경우 중 더 큰 값을 기준으로 내림차순 정렬한다.
(6과 10을 비교하고자 할때 문자열 자체로 더해 610과 106을 비교, 이때 610이 더 큰 값이기 때문에 6이 10보다 큰 수라고 결론 내리고 6, 10 순서로 내림차순 정렬한다.)
<< 아래 코드 처럼 구현할 수 있다. >>
Arrays.sort(strNumbers, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o2 + o1).compareTo(o1 + o2);
}
});
// 오름차순으로 구현
(o1 + o2).compareto(o1 + o2);
// 람다식으로 구현
Arrays.sort(strNumbers, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
- 정렬된 상태로 String 배열 요소들을 하나의 문자열로 만든다.
- 배열의 값이 {"0", "0", "0,"}인 경우 결과값이 "000"이 아닌 "0"이 될 수 있도록 조건문을 넣어준다.
이는 결국 크기 순으로 내림차순 하였을 경우 제일 큰 값이 들어있을 첫번째 인덱스의 값이 0일 경우와 같다.
코드
import java.util.Arrays;
import java.util.Comparator;
public class 가장_큰_수 {
public static void main(String[] args) {
System.out.println(solution(new int[]{6, 10, 2})); //6210
System.out.println(solution(new int[]{3, 30, 34, 5, 9})); //9534330
}
public static String solution(int[] numbers) {
String answer = "";
String[] strNumbers = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
strNumbers[i] = String.valueOf(numbers[i]);
}
Arrays.sort(strNumbers, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o2 + o1).compareTo(o1 + o2);
}
});
if (strNumbers[0].equals("0")) {
return "0";
}
answer = String.join("", strNumbers);
return answer;
}
}