본문 바로가기

알고리즘

[프로그래머스] 가장 큰 수 [JAVA]

반응형

출처 : programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

알게된 점

1. 정수형 -> 문자열로 바꾸는 법
  1-1) String.valueOf( 정수 )
  1-2) Integer.toString( 정수 ) 

2. 문자열 크기 비교하기
  1-1) "3".compareTo("30") 
    - 사전 순으로 작으면 -1 , 같으면 0 , 크면 1 return;
    -  3 < 30 으로 인식 따라서 -1 리턴 
    ex. 4.compareTo("30") 
    -  4가 30보다 앞에 나오기 때문에  1 리턴
  
  2) But, 기본 정렬방식은 오름차순으로 -1 이면 왼쪽 / 1이면 오른쪽으로 정렬된다.
      따라서 우리가 구하고자 하는 것은, 큰 순서이기 때문에 앞에 - 부호 붙이기.

3. Comparator 는 왜 익명 클래스로 밖에 사용이 안될까? ㅜ 

4. 주의할 점은 만약 정렬했는데 맨앞이 0 이라는 소리는, 입력 값이 0 0 00 0 0 이라는 말이다.
   따라서, 그냥 0을 리턴해줘야 마지막 케이스에 안걸린다..ㅠㅠ 어렵당

 

 

풀이 - 1 ( 단순 문자열 비교하면 틀림 )

  ex. 3 과 30 비교하면 30이 더 크게나온다. ( 사전 순 ) - 실제는 330 과 303 과 같이 순서에 따라 크기가 달라짐

import java.util.*;

class Solution {
    
    static ArrayList<Number> number ;
        
    public static class Number implements Comparable<Number>{
        String number;
        public Number(String number){
            this.number = number;
        }
        
        @Override
        public int compareTo(Number o){
            return -this.number.compareTo(o.number);
        }
    }
    
    public String solution(int[] numbers) {
       
        String answer ="";
        number = new ArrayList<>();
        
        for( int i=0; i<numbers.length; i++){
            number.add(new Number(String.valueOf(numbers[i])));
        }
        
        Collections.sort(number);
        for( int i=0; i<number.size(); i++){
            answer += number.get(i).number;
        }
                
        return answer;
    }
    
    
}

풀이 - 2 - Comparator

import java.util.*;

class Solution {
    
    static ArrayList<Number> number ;
        
    public static class Number implements Comparator<Number>{
        String number;
        public Number(String number){
            this.number = number;
        }
        
        @Override
        public int compare(Number o1, Number o2){
            return -(o1.number+o2.number).compareTo(o2.number+o1.number);
        }
    }
    
    public String solution(int[] numbers) {
       
        String answer ="";
        number = new ArrayList<Number>();
        //Number mycomparator = new Number();
        
        for( int i=0; i<numbers.length; i++){
            //number.add(new Number(String.valueOf(numbers[i])));
            number.add(new Number(Integer.toString(numbers[i])));
        }
        
        //Collections.sort(number);
        
        Collections.sort(number, new Comparator<Number>(){
            @Override
            public int compare(Number o1, Number o2){
                return -(o1.number+o2.number).compareTo(o2.number+o1.number);
            }            
        });
        
        if( number.get(0).number.equals("0")) return "0";
        
        for( int i=0; i<number.size(); i++){
            answer += number.get(i).number;
        }
        
        return answer;
    }
    
    
}

풀이 - 3  - Comparable

import java.util.*;

class Solution {
    
    static ArrayList<Number> number ;
        
    public static class Number implements Comparable<Number>{
        String number;
        public Number(String number){
            this.number = number;
        }
        
        @Override
        public int compareTo(Number o){
            return -(this.number+o.number).compareTo(o.number+this.number);
        }
    }
    
    public String solution(int[] numbers) {
       
        String answer ="";
        number = new ArrayList<Number>();
        //Number mycomparator = new Number();
        
        for( int i=0; i<numbers.length; i++){
            //number.add(new Number(String.valueOf(numbers[i])));
            number.add(new Number(Integer.toString(numbers[i])));
        }
        
        Collections.sort(number);
        /*
        Collections.sort(number, new Comparator<Number>(){
            @Override
            public int compare(Number o1, Number o2){
                return -(o1.number+o2.number).compareTo(o2.number+o1.number);
            }            
        });
        */
        if( number.get(0).number.equals("0")) return "0";
        
        for( int i=0; i<number.size(); i++){
            answer += number.get(i).number;
        }
        
        return answer;
    }
    
    
}
반응형