프로그래머스 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()과 다르게 채워넣는 각 요소에 대한 연산이 가능하다
  • 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가지 이유

좋은 웹페이지 즐겨찾기