코딩테스트/프로그래머스

가장 큰 수

Debin 2022. 6. 25.
반응형

아래는 문제 링크입니다.

https://programmers.co.kr/learn/courses/30/lessons/42746?language=java 

 

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

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

programmers.co.kr

이번 문제를 풀면서 또다시 느꼈다. 문제를 난잡하게 풀고 있으면, 웬만하면 잘못된 풀이란 것을..

 

문자열로 받아서 Comparable을 구현하는 클래스를 만들어 정렬을 하려고 했다.

웬걸 이런 방식으로 하니 자릿수마다 멤버 변수를 만들고, 이 자리에 대한 정보 값도 넣고 너무 복잡해졌다. 

역시 복잡한 풀이 방식은 다시 생각할 필요가 있는 것 같다.

 

결국 힌트를 얻으려고 해당 문제 게시판을 보았고, Comparator을 사용하라는 힌트를 보았다.

 

맨날 Comparable만 사용했지, Comparator을 사용한 적은 드물다. 

그래서 이번에는 Comparator을 사용해보기로 했다.

  • 둘 다 자바에서 정렬을 할 때 중요한 인터페이스다.
  • Comparable은 자기 자신과 매개변수로 들어오는 객체를 비교한다.
  • Comparaotr은 매개 변수로 들어오는 두 객체를 비교한다.
  • 두 방식다 리턴 값이 양수면 자리를 교환하고, 0이나 음수면 자리를 교환하지 않는다.

그리고 다음과 같은 정렬 방법을 확인했다. 바로 Collections의 sort 메서드다.

Comparator (함수형 인터페이스)를 매개 변수로 사용한다. 이것을 람다로 사용하면 편하게 문제를 해결 할 수 있을 것 같았다.

Collections.sort의 매개변수가 함수형 인터페이스인 Comparator

이제 익명 클래스를  작성해야 하는데, 함수형 인터페이스는 메서드를 하나만 가지고 있다.

그리고 반드시 이를 오버라이딩해야한다. 오버라이딩한 compare 메서드에서 String 클래스의 compareTo 메서드를 사용했다.

인스턴스와 매개변수의 아스키 값을 비교해 차이를 돌려주기 때문에 리턴 타입이 int형이다.

String 클래스의 compareTo 메서드

동작 방식은 아래 코드에서 확인할 수 있다.

 String str1 = "1";
 String str2 = "9";
 System.out.println(str2.compareTo(str1));
 //8이 출력된다.
        
       
 String str1 = "1";
 String str2 = "9";
 System.out.println(str1.compareTo(str2));
 //-8이 출력된다.

 

아래는 해답 코드다.

import java.util.*;

class Solution {
    
    public String solution(int[] numbers) {
        List<String> arr = new ArrayList<>();
        String answer = "";

        for (int number : numbers) {
            arr.add(String.valueOf(number));
        }

        Collections.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo(o1 + o2);
            }
        });

        if(arr.get(0).equals("0")) {
            return "0"; //제일 처음이 0이면 0을 리턴.
        }

        for (String s1 : arr) {
                answer += s1;
        }


        return answer;
    }
}

Comparator도 확인하고 String 클래스의 compareTo도 확인할 수 있는 좋은 기회였다.

난이도가 너무 높지 않은데, 문제 풀이가 복잡해지면 다시 생각해보자.

 

이상으로 포스팅을 마칩니다. 감사합니다.

반응형

댓글