가장 큰 수(java)
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbersreturn
[6, 10, 2] | "6210" |
[3, 30, 34, 5, 9] | "9534330" |
https://programmers.co.kr/learn/courses/30/lessons/42746
풀이 1
class Solution {
public String solution(int[] numbers) {
String[] arr = convertIntArrToStringArr(numbers);
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s2+s1).compareTo(s1+s2);
}
});
if("0".equals(arr[0])) return "0";
return convertArrToString(arr);
}
public String convertArrToString(String[] arr) {
StringBuilder sb = new StringBuilder();
for(String a: arr) {
sb.append(a);
}
return sb.toString();
}
public String[] convertIntArrToStringArr (int[] intArr) {
int len = intArr.length;
String[] strArr = new String[len];
for(int i=0;i<len;i++) {
strArr[i] = Integer.toString(intArr[i]);
}
return strArr;
}
}
- int[]를 String[]으로 변환
- String[]를 정렬
- String[]을 String 형태로 변환
위 코드로도 통과는 하지만 이를 java 라이브러리를 적극 사용하도록 개선해보겠다.
우선 정렬하는 부분을 살펴보자.
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s2+s1).compareTo(s1+s2);
}
});
Comparator의 compare 메소드를 오버라이드하여 내가 원하는 기준으로 정렬시켰다.
이 부분을 람다를 활용하면 더 간략화할 수 있다.
Arrays.sort(arr, (s1, s2) -> { return (s2+s1).compareTo(s1+s2); });
Java는 Arrays.sort()의 두번째 인자에 대해서 Comparator가 올 것이라고 이미 알고있다.
Comparator 선언부터 compare 메소드명까지 생략이 가능하다.
arr가 String[]이므로 파라미터도 String형태가 올 것임을 예상하고 생략했다.
여기서 더 간략화해보자.
Arrays.sort(arr, (s1, s2) -> (s2+s1).compareTo(s1+s2));
복잡한 식 없이 s1와 s2의 비교에 대한 연산만 return했으니 아예 이 부분도 생략해줬다.
람다식을 활용해 정렬 부분의 코드가 깔끔해진 것을 확인할 수 있다.
스트림을 활용하면 위 코드 전체를 깔끔하게 만들 수 있다.
class Solution {
public String solution(int[] numbers) {
String answer = IntStream.of(numbers)
.mapToObj(String::valueOf)
.sorted((s1, s2) -> (s2+s1).compareTo(s1+s2))
.collect(Collectors.joining());
if(answer.startsWith("0")) return "0";
return answer;
}
}
- IntStream.of(arr) 배열을 int stream으로 변환
- mapToObj(String::valueOf) 각 요소에 대해 String.valueOf(요소) 반환
- sorted() 정렬
- collect(Collectors.joining()) 배열의 각 요소 붙이기
기존 코드를 stream으로 바꾸면서 String[]이 없어졌다.
배열의 첫 요소가 0인지 검사하던 코드를 answer이 0으로 시작하는지 확인하는 코드로 수정했다.
때에 따라 적당한 경우가 다르겠지만 Stream을 활용하면 코드가 정말 보기 편해지는 것 같다.
Stream 더보기 -> https://yeonyeon.tistory.com/74
'Memo > 코테' 카테고리의 다른 글
[백준] 스도쿠 (0) | 2021.11.22 |
---|---|
[프로그래머스] 10주차 위클리 (0) | 2021.10.13 |
[프로그래머스] 2개 이하로 다른 비트 (2) | 2021.10.07 |
[백준] 1152번: 단어의 개수 (0) | 2021.10.06 |
백준 - 빗물 (JAVA) (0) | 2021.10.01 |