프로그래머스 가장 큰 수 (실패 분석, java)

byeol·2023년 4월 5일
0

접근

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

처음에 Math.log10을 자리수를 알아낸 다음에
거기에 Math.pow()를 통해서 10의 n승을 통해서 숫자의 앞자리를 비교해서
정렬하려고 했었다.

그러나 이 경우에 앞자리가 같은 경우
생각할 부분이 너무 많았다.

앞자리가 같은 경우 자리수가 같다면 크기를 한번더 비교하고
자리수가 다르다면 990 90 ,
90,9 등 생각할 것이 많았기 때문에
풀다가 1시간 풀기로 한 제한 시간을 넘어가 포기했다.

다른 사람들의 풀이를 보았을 때
String 배열로 만들어서 사전 순으로 정렬하는 것에 대해서 배우게 되었다.

과정

항상 compare이나 comparTo를 통해서 정렬하는 방법에 대해
잊어버리고 다시 보고를 반복하는거 같다.

https://velog.io/@byeolhaha/%EB%B0%B1%EC%A4%80-11651%EB%B2%88-Arrays.sortarr-comp-%EA%B5%AC%ED%98%84%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C

일단 그 이전에 정리한 글을 복습했는데
Comparator의 compare은 return 값이 양수일 때 자리바꿈이 일어난다.
꼭 기억하자 양수일 때 자리 바꿈이 일어난다!

그리고 compareTo() 함수를 정리해보려고 한다.

  • 숫자의 비교 : 단순히 크다(1) 작다(-1) 같다(0)

  • 문자열 비교

      String str = "abcd";
      
      System.out.println(str.compareTo("ab"));//2
      System.out.println(str.compareTo("a"));//3
      System.out.println(str.compareTo("c"));//-2

    여기서 보면 앞자리를 기준으로 시작되고
    앞자리를 기준으로 서로 다른 길이를 반환한다.

    예를 들어서 "abcd"와 "a"는 3자리가 다르므로 3이며
    "abcd"와 "c"의 경우 앞자리를 기준으로 다르므로
    "a"의 아스키코드 97 - "c"의 아스키코드 99= -2가 반환되는 것이다.

    따라서 결국 compareTo를 통해서 두 문자열 중에서 누가 사전순으로 우위에 있는가를 비교할 수 있게 되는 것이다.

    양수가 나오면 기준 문자열이 뒤에 나오는 것이고 음수가 나오면 기준 문자열이 더 앞에 나오는 것이다.

    따라서 이렇게 양수, 음수, 0을 이용해서

    Comparator의 compare() 함수를 이용하는 것이다!

풀이

import java.util.*;

class Solution {
   public String solution(int[] numbers) {
       String answer = "";    
       
       String[] arr = new String[numbers.length];
       boolean tag = true;
       for(int i=0;i<numbers.length;i++){
           arr[i] = Integer.toString(numbers[i]);
           if(numbers[i] !=0) tag=false;
       }
       
       Arrays.sort(arr, new Comparator<String>(){
           @Override
           public int compare(String s1, String s2){
               //s2의 앞자리가 s1의 앞자리보다 큰 경우 s2,s1
               //s2의 앞자리가 s1의 앞자리보다 작은 경우 s1,s2
               return (s2+s1).compareTo(s1+s2);
           }
       });
       
       
       for(String s : arr){
           answer+=s;
       }
       
       if(tag) return "0";
            
       
       return answer;
   }
}
profile
꾸준하게 Ready, Set, Go!

0개의 댓글

관련 채용 정보