개발공부/코딩테스트 연습문제

[프로그래머스] Level.2 가장 큰 수 (JAVA)

ku-na 2022. 2. 8. 10:38

문제 설명과 제한사항

풀이

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        List<String> nums = new ArrayList<String>();
        String num1, num2;
        for(int num : numbers){
            nums.add(Integer.toString(num));
        }
        
        Collections.sort(nums,Collections.reverseOrder());
        
        for(int i = nums.size()-1; i > 0; i--){
            num1 = nums.get(i);
            num2 = nums.get(i-1);
            
            if(num2.startsWith(num1) && num2.length() > num1.length()){
                int n1 = Integer.parseInt(num1);
                int n2 = Integer.parseInt(num2.substring(1,num1.length()+1));
                
                if(n1 > n2) {
                    nums.set(i,num2);
                    nums.set(i - 1, num1);
                }
            }
        }
        
        for(int i = 0; i < nums.size(); i++){
            answer += nums.get(i);
        }
        
        if(answer.startsWith("0")) return "0";
        
        return answer;
    }
}

 

++

결과는 다음과 같다..

내 풀이는 문자열 List 로 변경해서 내림차순으로 sort

그러면 6, 10, 2 는 6, 2, 10

3, 34, 30, 5, 9 는 9, 5, 34, 30, 3 으로 정렬된다

이 상태에서 첫번째 예시는 바로 만들 수 있지만 두번째 예시는

9 5 34 30 3 보다 9 5 34 3 30이 더 크기 때문에 

순서를 바꿔줘야 한다고 생각했다.

때문에 마지막 순서부터 num1(3), num2(30)

1. num2가 num1으로 시작하면

2. num2의 길이가 num1보다 길다면 (중복값)

3. num2의 1번째 30 에서 0 부터 num1길이만큼 자른다.

4. 두 값을 비교해서 num1이 더 크면 자리를 바꾼다.

는 식으로 접근했지만 실패..

 

++ 

다른 사람들의 풀이를 검색해보니 compareTo를 통해 간단하게 풀었다.

풀이의 내용을 보면 num1 과 num2를 비교했을때 num2의 o1 + o2 (30) 보다 o2 + o1 (03)이 더크면 바꾸는 식 이었던걸로 기억한다. 조금 더 풀어보고, 무리가 있다고 생각되면 compareTo를 공부해서 다시 풀어볼 예정이다.