반응형

 

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

 

프로그래머스

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

programmers.co.kr

 

 

    int len = (int) (Math.log10(numbers[i])+1); //자릿수
    if(len >= 2){
        a = numbers[i]/(1*(10*(len-1))); //앞자리 숫자
    } else {
        a = numbers[i];
    }

앞자리 수만 비교해서 정렬 후 앞자리가 같으면 뒷자리 정렬하면 되겠지 생각했다.

처음엔 삽질 너무 많이 하다가 안되겠다 싶고 이걸 풀어도 시간초과나겠다 싶어서 결국 구글링.,,.,

 


🌌 전체 코드

import java.util.Arrays;

class Solution {
    public String solution(int[] numbers) {
        StringBuilder sb = new StringBuilder(); 
        String[] arr = new String[numbers.length];
        
        for(int i=0; i<numbers.length; i++){
            arr[i] = Integer.toString(numbers[i]);
        }
        
        Arrays.sort(arr, (String o1, String o2) -> (o2+o1).compareTo(o1+o2));
        
        if(arr[0].equals("0")){ return "0"; }
        
        for(String val : arr) sb.append(val);
        
        return sb.toString();
    }
}

1. String 배열로 요소들을 다 넣어준다.

 

(처음 시도엔 int로 처리하고 결과 값을 String으로 형변환해주려고 했는데 이건 너무 멀리가야했음)

StringBuilder sb = new StringBuilder(); 
String[] arr = new String[numbers.length];

for(int i=0; i<numbers.length; i++){
    arr[i] = Integer.toString(numbers[i]);
}

 

 

2. compareTo 사용하여 비교 

그냥 정렬하게 될 경우 6102가 반환되는데, 6102 < 6210 이므로

각각 더 한 값을 비교하여 큰 값을 리턴한다.

아래 코드 후 arr를 출력해보면 [6, 2 , 10]으로 출력된다.

 

compareTo!!

람다식을 활용하면 코드를 간결하게 작성할 수 있다. 니꼬 js강의 들을 때 람다식으로 많이 써서 그나마 익숙해졌다!

Arrays.sort(arr, (String o1, String o2) -> (o2+o1).compareTo(o1+o2));

이 부분만 알면 간단한 문제였다,,

 

Arrays.sort(arr, new Comparator<String>(){
    @Override
    public int compare(String a, String b){
        return (b + a).compareTo(a + b);
    }
});

이런 식으로도 쓸 수 있는데 완벽하게 Comparator를 잘 몰라서 더 알아봐야 할 것 같다.

그리고 Collections.sort(); 을 활용한 분도 계셨는데 이것도,, ( 리스트를 사용하심 List<Integer> list = new ArrayList<>();  )

 

 

3. 앞자리가 0이라면 0을 반환

 

0000이라면 0을 출력해야하니깐

if(arr[0].equals("0")){ return "0"; }

 

4. 출력 

for(String val : arr) sb.append(val);

return sb.toString();
반응형