문제풀이는 나의 풀이보다 더 깔끔한 소스로.....

문제 풀이 CASE 1.
package algorithm;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution1 {
public static void main(String[] args) {
int num[] = {10,50,64,20,31,40};
String result = solution(num);
System.out.println(result);
}
public static String solution(int[] numbers) {
String answer = "";
List<Integer> list = new ArrayList<>();
for(int i = 0; i < numbers.length; i++) {
list.add(numbers[i]);
}
Collections.sort(list, (a, b) -> {
// list에서 순서대로 2개의 요소를 추출합니다. 이를 각각 a와 b로 정의하고 String 자료형으로 만들어 as와 bs를 만듭니다.
String as = String.valueOf(a);
String bs = String.valueOf(b);
/*
* return문에 보면 as + bs 와 bs + as를 수행합니다.
* 만약 as = 10, bs = 20인 경우, 연산의 결과는 1020과 2010으로 나옵니다.
* 이 결과 값을 가지고 Integer.compare()를 수행합니다.
* Integer 라이브러리의 compare 함수를 살펴보면 x==y 인 경우 0을 반환, x < y인 경우 음수, x > y인 경우 양수를 반환합니다.
* 1020과 2010을 비교하면 x < y인 경우로, 음수를 반환합니다.
* Integer.compare()로부터 나온 연산 결과를 Collections.sort() 내부의 comparator에서 사용하게 됩니다.
* comparator의 경우 음수는 오름차순, 양수는 내림차순으로 요소의 자리를 바꿔줍니다.
* 즉, Integer.compare()는 (ab + sb) < (sb + ab)인 경우에 음수를 반환하지만 sb가 ab보다 앞에 위치하도록 만들기 위해서
* Integer.compare() 앞에 마이너스(-) 부호를 붙여 양수를 반환하게 하여 Collections.sort()가 내림차순으로 정렬하도록 하는 것입니다.
*/
return -Integer.compare(Integer.parseInt(as + bs), Integer.parseInt(bs + as));
});
StringBuilder sb = new StringBuilder();
for(Integer i : list) {
sb.append(i);
}
answer = sb.toString();
if(answer.charAt(0) == '0') {
return "0";
}else {
return answer;
}
}
}
문제풀이 CASE2.
import java.util.Arrays;
class Solution1 {
public static void main(String[] args) {
int num[] = {10,50,64,20,31,40};
String result = solution(num);
System.out.println(result);
}
public static String solution(int[] numbers) {
String answer = "";
answer = Arrays.stream(numbers)
// 기본형 특화 스트림을 Stream으로 변환해주는 메서드다.
.mapToObj(String::valueOf)
// sorted는 스트림의 아이템들을 정렬하여 새로운 스트림을 생성합니다.
.sorted((s1, s2) -> -s1.concat(s2).compareTo(s2.concat(s1)))
// Stream의 데이터를 변환하지 않고, 더하거나 빼는 등의 연산을 수행하여 하나의 값으로 만든다면 reduce를 사용할 수 있습니다.
// reduce()의 param으로 (total, n) -> total + n가 전달되고, reduce는 a1, a2, a3, a4...의 stream을 a1 + a2 + a3 + a4...로 연산을 수행합니다.
// 첫번째로 total=a1, n=a2가 되고, 두번째로 total=(a1+a2), n=a3가 됩니다.
.reduce("", (s1, s2) -> s1.equals("0") && s2.equals("0") ? "0" : s1.concat(s2));
return answer;
}
}
언제쯤 이런 코딩을 할 수 있을까....
'Algorithm' 카테고리의 다른 글
[Algorithm] 야근지수 (0) | 2022.10.13 |
---|---|
[Algorithm] 평균구하기 (0) | 2022.10.11 |
[Algorithm] 로또의 최고 순위와 최저 순위 (0) | 2022.08.31 |
[Algorithm] 같은 숫자는 싫어 (0) | 2022.08.30 |
[Algorithm] 알고리즘 공부 시작 방법 및 순서 (0) | 2022.08.26 |