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를 활용해 정렬된 문자열을 합쳐주었다.
나에게 부족한 부분인 람다식과 스트림을 활용해보기에 좋은 문제였다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스] 완주하지 못한 선수 (JAVA) (0) | 2025.05.30 |
---|---|
[프로그래머스] 타겟 넘버 (JAVA) (0) | 2025.02.17 |
[프로그래머스] 신규 아이디 추천 (JAVA) (1) | 2025.02.01 |
[프로그래머스] 영어 끝말잇기 (JAVA) (1) | 2025.01.25 |
[프로그래머스] 구명보트 (JAVA) (3) | 2025.01.25 |