코딩테스트

[프로그래머스] 자바(Java) - 가장 큰 수

수방방 2024. 7. 5. 16:17

🧩 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 주어진 정수 배열의 숫자들을 조합하여 가장 큰 수를 만드는 문제
  • 숫자를 문자열로 변환한 후 특정 기준에 따라 정렬하여 최종 결과를 얻는다.

 

💡 알고리즘 설계

  1. 숫자 배열을 문자열 배열로 변환합니다.
    • 숫자 배열을 문자열 배열로 변환해야 하는 이유는 숫자들을 단순히 숫자로 비교하는 것이 아닌, 숫자를 이어붙였을 때의 크기를 비교해야 하기 때문입니다.
    • ex) "9" > "330" : 문자열의 비교는 사전식 비교이기 때문에 각 문자의 유니코드 값을 왼쪽부터 오른쪽으로 하나씩 비교하여 순서를 결정
  2. 문자열로 변환한 배열을 정렬합니다.
    • 두 문자열을 이어붙여서 비교하는 방식으로 정렬합니다.
  3. 정렬된 배열을 String으로 이어붙여서 최종 결과를 반환합니다.
import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String[] strArr = new String[numbers.length];
        
        for (int i = 0; i < numbers.length; i++) {
            strArr[i] = Integer.toString(numbers[i]);
        }
        Arrays.sort(strArr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
        
        if(strArr[0].equals("0")) return "0";
        
        return String.join("", strArr);
    }
}
  • int[] numbers 배열의 요소를 String으로 변환합니다.
    • `Integer.toString()` 메서드를 사용해 String 으로 변환
  • `Arrays.sort(strArr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2))`를 사용하여 문자열 배열을 정렬합니다.
    • 두 문자열 o1과 o2를 이어붙여서 (o2 + o1)와 (o1 + o2)를 비교하여 더 큰 값을 선택합니다.
  • 정렬된 배열을 String으로 합쳐서 반환합니다.
    • `String.join()`을 사용하여 배열의 값을 하나의 문자열로 합침

 

📍 처음 작성한 틀린 코드와 틀린 이유

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String[] strArr = new String[numbers.length];
        
        for (int i = 0; i < numbers.length; i++) {
            strArr[i] = Integer.toString(numbers[i]);
        }
        Arrays.sort(strArr, Collections.reverseOrder());
        
        return String.join("", strArr);
    }
}
  • 이 코드는 `Collections.reverseOrder()`를 사용하여 문자열을 단순히 내림차순으로 정렬합니다.
    • [3, 30, 34, 5, 9] 배열을 예를 들자면
      1. 문자열로 변환 : [ "3", "30", "34", "5", "9" ]
      2. `Collections.reverseOrder()`를 사용하여 정렬 : [ "9", "5", "34", "30", "3" ] 
      3. 문자열로 join : "9534303"
      4. -> 하지만 이 배열에서 가장 큰 수는 "9534330"로 조합할 수 있다.
  • 즉, 이 코드는 각 숫자의 조합이 가장 큰 수를 만드는데 필요한 정렬 기준을 충족하지 못합니다.

 

🧠 배운 점

  • 문자열 비교의 중요성
    • 숫자를 문자열로 변환하여 비교하는 경우, 단순한 숫자 비교와는 다른 결과를 얻을 수 있습니다.
    • 예를 들어, 숫자 3과 30을 비교할 때, 숫자로는 3 < 30이지만 문자열로는 "3"이 "30"보다 앞에 옵니다. 따라서 문자열 비교를 통해 더 큰 수를 만들 수 있는 방법을 배웠습니다.
  • 정렬에 대하여
    • Java의 `Arrays.sort()` 메소드를 활용하여 람다 표현식으로 커스텀 정렬 기준을 설정하는 방법을 이해했습니다.
  • 문자열 합치기와 String.join()의 사용
    • 배열의 요소를 하나의 문자열로 합치는 방법을 배웠습니다.
    • `String.join()` 메소드를 사용하면 배열의 요소를 간편하게 하나의 문자열로 합칠 수 있습니다.