240405 TIL #365 CT_Largest Number (Greedy)

김춘복·2024년 4월 5일
0

TIL : Today I Learned

목록 보기
365/494

Today I Learned

오늘은 간만에 자바 코테 공부!


Largest Number

Leetcode 179번 https://leetcode.com/problems/largest-number/description/

문제

Given a list of non-negative integers nums, arrange them such that they form the largest number and return it.
Since the result may be very large, so you need to return a string instead of an integer.

  • 입력
    nums = [3,30,34,5,9]
  • 출력
    "9534330"

문제 풀이

  • 이 문제는 주어진 숫자 배열을 그리디 알고리즘을 사용해 가장 큰 수를 만들어 반환하는 방법으로 풀었다.
  1. 각 숫자를 문자열로 변환해서 처리하기 위해 숫자 배열을 문자열 배열로 바꾼다. String.valueOf() 메서드를 활용한다.

  2. 해당 문자열 배열을 비교함수를 새로 구현해서 정렬한다. 이 부분은 처음에는 Comparator를 이용해 compare 함수를 새로 정의해서 풀었지만, 리팩토링 단계에서 람다로 바꿔쓰면 편하게 쓸 수 있을 것 같아서 수정했다.

// 1. Comparator 활용
Arrays.sort(arr, new Comparator<String>() {
   public int compare(String a, String b) {
        String order1 = a + b;
        String order2 = b + a;
        return order2.compareTo(order1);
        }
    });
// 2. 람다 활용
Arrays.sort(arr, (a, b) -> {
    String order1 = a + b;
    String order2 = b + a;
    return order2.compareTo(order1);
});

// 3. 람다 + compare 활용
Arrays.sort(arr, (a, b) -> (b + a).compareTo(a + b));
  1. 0만 들어있는 배열의 결과는 0이 되어야하므로 조건문을 하나 넣어둔다.

  2. StringBuilder를 이용해 문자열 배열을 이어 붙여서 결과를 반환하면 완료!


Java 코드

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String largestNumber(int[] nums) {
        
        String[] arr = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            arr[i] = String.valueOf(nums[i]);
        }

        Arrays.sort(arr, (a, b) -> (b + a).compareTo(a + b));
        
        if (arr[0].equals("0")) {
            return "0";
        }

        
        StringBuilder sb = new StringBuilder();
        for (String s : arr) {
            sb.append(s);
        }
        return sb.toString();
    }
}

profile
꾸준히 성장하기 위해 매일 log를 남깁니다!

0개의 댓글