개발에 AtoZ까지

[JAVA][정렬][L2] 가장 큰 수 본문

코딩테스트 준비/프로그래머스

[JAVA][정렬][L2] 가장 큰 수

AtoZ 개발자 2021. 1. 17. 20:15
반응형

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

더보기

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예

numbers                                                               return
[6, 10, 2] 6210
[3, 30, 34, 5, 9] 9534330

코드

코드설명: 배열에 있는 숫자를 문자로 변환하고 인덱스 i번째에 있는 숫자와 인덱스 i+1의 문자를 결합하여 사전적 순서대로 정렬한다.

정렬하고 해당 문자를  합치는데 합칠때 String대신 StringBuilder를 사용하여 남용되는 메모리를 없애고 속도를 향상시킨다

import java.util.*;

class Solution {
	// 1. 2개의 숫자를 앞뒤로 붙여서 어느게 사전적으로 앞서있는지 확인한다.
	public String solution(int[] numbers) {
		StringBuilder answer = new StringBuilder();
		String[] str = new String[numbers.length];

		for (int i = 0; i < numbers.length; i++) {
			str[i] = Integer.toString(numbers[i]);
		}
        //앞의 숫자와 뒷 숫자를 합쳐서 비교해서 정렬
		Arrays.sort(str, (a, b) -> (b + a).compareTo(a + b));
        //만약 str의 첫 문자가 0이라면 str에는 0밖에 없다는 뜻이므로 0을 반환해준다.
		if (str[0].equals("0")) {
			return "0";
		}
        //문자를 합친다
		for (int i = 0; i < str.length; i++) {
			answer.append(str[i]);
		}
		return answer.toString();
	}

}

반응형
Comments