[ 프로그래머스 - java ] 가장 큰 수 (정렬)
가장 큰 수
<문제 설명>
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
[ 풀이 ]
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public String solution(int[] numbers) {
String answer = "";
//int 배열을 String 배열로 변환
String[] arr = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
arr[i] = (String.valueOf(numbers[i]));
}
//배열 정렬, 정렬 규칙으로는 2개를 더하여 더 큰 쪽이 우선순위가 있도록 정렬(내림)
/*Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s2+s1).compareTo(s1+s2); //내림차순
//내림차순 : (s2+s1).compareTo(o1+02);
//오름차순 : (s1+s2).compareTo(s1+s2);
}
});*/
//람다식으로 한줄로 표현가능
Arrays.sort(arr, (s1, s2) -> (s2 + s1).compareTo(s1 + s2));
//0000 처럼 0으로만 구성되어있으면 0 return
if (arr[0].equals("0")) return "0";
//그 외의 경우 순차적으로 연결하여 answer return
for (int i = 0; i < arr.length; i++) {
answer+=arr[i];
}
return answer;
}
}
compareTo() 매서드 - 문자열 간 크기(순서)비교
- 앞에서부터 비교하다 다른 문자열이 나오면 a-b순서로 해당 문자의 아스키코드 값을 뺀 결과(int)를 리턴한다.
- 내림차순 : (s2+s1).compareTo(o1+02);
- 오름차순 : (s1+s2).compareTo(s1+s2);
- ex) a.compareTo(b)
람다식
- 딱 하나의 추상 메소드만 가진 인터페이스를 구현할 때 사용하는 문법
[람다식 한줄 문법]
- (매개변수) -> 명령문; // 리턴값이 있다면 자동으로 수행 결과가 리턴된다.
ex) Arrays.sort(arr, (s1, s2) -> (s2 + s1).compareTo(s1 + s2));
[람다식 여러줄 문법]
- (매개변수) -> {명령문; 명령문; 명령문; return; }
String형으로 변환
[ toString() ]
- object가 null값일 경우 Null PointerException(NPE)을 발생시킨다.
- object에 담긴 값이 String이 아니여도 출력가능
ex) int a = 12;
a.toString(); // "12"
[ String.valueOf() ]
- "null"이라는 문자열로 처리 (파라미터가 null이면 "null"로 반환)
- 항상 String 형태로 출력한다.
- NPE를 방지하기 위해서는 String.valueOf()사용을 추천한다.
ex) int a= 12;
String.valueOf(a); //"12"