프로그래머스 L2 - 가장 큰 수(Java)
solution
- 문자열 비교 정렬을 먼저 생각
- 객체를 비교하는 방법은 Comparator 객체의 CompareTo를 오버라이딩
public static String solution(int[] numbers) {
StringBuilder answer = new StringBuilder();
String[] strNumbers = new String[numbers.length];
// 단순 메소드 호출, lambda 변환
Arrays.setAll(strNumbers, i -> String.valueOf(numbers[i]));
// 단순 오버라이딩, lambda 변환
Arrays.sort(strNumbers, (o1, o2) -> (o2+o1).compareTo(o1+o2));
if (!strNumbers[0].startsWith("0")) {
for (String strNumber : strNumbers) {
answer.append(str_number);
}
} else {
answer.append("0");
}
return answer.toString();
}
- for-loop를 통한 배열 채우기는 컬렉션 프레임워크와 람다식을 활용하면
한줄로 줄일 수 있다- Arrays.setAll()
Arrays.fill()과 다르게 채워넣는 각 요소에 대한 연산이 가능하다
- Arrays.setAll()
- CompareTo 오버라이딩의 경우도 Comparator 객체 구현부터 오버라이드 부분을 람다식으로 대체할 수 있다
- 문자열 연산은 += 보다는 String Builder를 활용하자
- 0으로만 되는 배열이 들어오는 경우 0으로만 반환해주어야 한다
문자열 비교정렬에 대해 공부하고 어렵지 않게 풀 수 있었다
다른 사람들 코드를 보니 자릿수 맞추어 풀기 그런걸 했던데 어떻게 그런 풀이방법이 생각나는지 좀 부럽다...
추가적으로 stream의 사용 유의점
-
stream 사용
-
primitve for loop 사용
처음에 for loop를 이용해서 작성했다가 단순 객체 감싸기면 Stream으로 빠르게 끝낼 수 있지않을까 싶어 Stream을 적용했는데 오히려 느리게 나왔다.
이에 관해 primitive type의 경우 일반적 for loop가 더 빠르기에 stream 사용에 유의해야한다는 글을 본 것 같았고, 검색해서 찾았다.
Stream 반복문 테스트와 그 결과
for loop를 for each로 바꾸지 말아야할 3가지 이유
Author And Source
이 문제에 관하여(프로그래머스 L2 - 가장 큰 수(Java)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@agugu95/L2-The-Biggest-Number저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)