프로그래머스

[프로그래머스] 가장 큰 수 (JAVA)

코 밑 2025. 2. 8. 20:38
Contents

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

0과 양의 정수가 담긴 배열의 정수를 이어붙여 가장 큰 수를 만들어 반환하는 문제다.

나는 이 문제를 풀기 위해 아직 친하지 않은 람다식과 스트림을 이용해 풀어보기로 했다.

 

// 프로그래머스 가장 큰 수
// 0, 양의 정수가 주어진 배열이 주어진다.
// 이 정수를 이어붙여 만들 수 있는 가장 큰 수 반환
// 1. 람다식 이용해 풀기 2. StringBuilder 이용해서 문자열로 변환
// 일단 오름차순 정렬인데 10 이상인 수는 앞자리 기준으로 정렬해야함
import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        StringBuilder sb = new StringBuilder();
        // 스트림을 활용해 문자열로 변환
        String[] answer = Arrays.stream(numbers)
                .mapToObj(String::valueOf) // mapToObj를 활용해 int -> String
                .toArray(String[]::new); // 새로운 String 배열

        // 람다식을 활용. 문자열로 변환한 배열이 두 수를 합쳤을 때 누가 더 큰 수인지 판별
        Arrays.sort(answer, (a, b) -> (b + a).compareTo(a + b));
        // 0으로만 이뤄진 배열인 경우
        if (answer[0].equals("0"))
            return "0";

        for (String s : answer)
            sb.append(s);
        // StringBuilder를 String으로 변환
        return sb.toString();
    }
}

 

먼저 Stream을 이용해 정수 배열을 문자열 배열로 변환했다.

.mapToObj()를 활용해 int 정수형을 String 문자열로 변환했고

.toArray()를 활용해 새로운 String 배열을 만들어 배열에 값을 넣어주었다.

 

자 이제 문자열 배열이 생겼다.

이 배열을 람다식을 활용해 앞 + 뒤와 뒤 + 앞으로 했을 때를 비교했다.

비교했을 때 더 큰 경우가 앞으로 오게 된다.
만약 a = 1, b = 10라면 110과 101을 비교하게 되는 것이다.

110이 더 크게 된 경우이므로 배열에는 {1, 10} 이렇게 남게 된다.

 

작은 경우가 앞에 오게 하고 싶다면

Arrays.sort(answer, (a, b) -> (a + b).compareTo(b + a));

 

이렇게 두 변수의 위치를 바꿔주면 된다.

다음엔 StringBuilder를 활용해 정렬된 문자열을 합쳐주었다.

 

나에게 부족한 부분인 람다식과 스트림을 활용해보기에 좋은 문제였다.

오늘의 저녁...떡볶이와 쏘스 품은 닭가슴살...