[프로그래머스 - 알고리즘] 정렬 가장큰수

jjuya·2024년 4월 30일
0

코딩테스트

목록 보기
8/10

문제 설명

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

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

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

제한 사항

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

입출력 예

numbersreturn
[6, 10, 2]"6210"
[3, 30, 34, 5, 9]"9534330"

solution

Comparator를 직접 구현하여 String끼리 값을 비교할 수 있는지를 묻는 문제

  1. 하나의 숫자끼리 비교해서 정렬을 하는것은 소용없음
    두 숫자를 합쳐서 비교해서 정렬을 해야함
  2. 숫자 비교시 문자열로 먼저 변환후 비교해야함
  3. 비교한 결과값으로 순서 재배치

=> Comparator 의 compareTo() 이용
오름차순으로 정렬시 (o2 + o1).compareTo(o1 + o2)
내림차순으로 정렬시 (o1 + o2).compareTo(o1 + o2)

Comparator의 compareTo

: 두개의 값을 비교하여 int 값으로 반환해주는 함수

  • 숫자의 비교 같은 경우 단순히 크다(1), 같다(0), 작다(-1) 의 관한 결과값을 리턴해주는 반면
  • 문자열의 비교 같은 경우 같다(0), 그 외 양수/음수값 같이 참 재미난 결과를 반환해준다.
import java.util.Arrays;
class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        // 문자열로 바꿔서 담아줄 배열 선언및 초기화
        String [] arr = new String[numbers.length]
        
        // 배열 복사해서 넣어주기
        for(int i=0;i < numbers.length;i++){
        	// 문자열로 변환해서 복사
            arr[i] = String.vauleOf(numbers[i]);  
        }
        // => 두 배열의 숫자가 더한 숫자가 아닌 문자열로 보여줘야하기 때문에 문자열 배열로 복사함
        
        // 정렬하기 - 비교후 내림차순으로 정렬
        Arrays.sort(arr, (o1,o2) -> (o2 + o1).compareTo(o1 + o2));
        
        //[0,0,0]의 배열의 경우 - 예외 처리 해주기
        if(arr[0].equals("0")){
        	return 0 
        }
        
        //문자열 연결 : String.join
        answer = String.join("",arr);
        
    
    	return answer;
    }
}
profile
Review the Record⭐

0개의 댓글