문제 내용은 int[] 배열 numbers를 받아서 가장 큰 값을 만든 뒤 String으로 반환해주면 되는데, 주의할 점은 배열이 0, 0 이런 식으로 들어왔다면 00이 아닌 0을 Return해야 한다
import java.util.Arrays;
public class LargestValue {
// 숫자 배열을 받아서 큰 수 위주로 배치해서 가장 큰 값을 Return 해야 함
// 34가 9보다 크지만 9앞에 와야 가장 큰 수이기 때문에 이걸 고려해야 함.. 근데 어떻게 ..
// while로 무한루프 돌리되 첫째자리, 둘째자리.. 이런 식으로 넣어볼까?
// 33 39 이렇게 비교하면 39가 와야 하는데 ..비교를 어떻게?
public static String solution(int[] numbers) {
String[] array = Arrays.stream(numbers).mapToObj(String::valueOf).toArray(String[]::new);
Arrays.sort(array, (a, b) -> (b + a).compareTo(a + b));
if (array[0].equals("0")) {
return "0";
}
StringBuilder sb = new StringBuilder();
Arrays.stream(array).forEach(sb::append);
return sb.toString();
}
public static void main(String[] args) {
int[] arr = {0, 0};
System.out.println(solution(arr));
}
}
문제를 풀어보자면 먼저 int[] 배열을 String[] 배열로 바꿔준 뒤, 값들을 합쳐봐서 가장 큰 값으로 정렬을 해 줘야 하는데 Arrays.sort(배열명, (a, b) -> (b + a).compareTo(a + b)); 을 사용해주면 크게 나오는 값으로 정렬해서 반환하게 되는데 Arrays.sort 메소드 자체가 여러 알고리즘 중 가장 효율적인 알고리즘을 사용하기 때문에, 무슨 정렬 알고리즘을 써야되나 이런 걱정은 하지 않아도 되고
문제와는 상관없지만 가장 큰 값 대신 작은 값을 찾으려면
Arrays.sort(배열명, (a, b) -> (b + a).compareTo(a + b)); 을
Arrays.sort(배열명, (a, b) -> (a + b).compareTo(b + a)); 으로 변경해주면 된다
이후 정렬을 마치고 나면 모든 배열이 0인 경우가 있으므로, 시작 인덱스가 0이라면 0 반환 후 끝내고, 그렇지 않다면 String 형태로 반환해야 하는데 String에 하나씩 붙이기에는 배열이 길면 많은 시간이 소모될 수 있기 때문에 StringBuilder를 사용해서 합쳐준 후 .toString() 으로 String으로 변경한 후 반환해주면 끝이다
Leave a Reply