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

이찬혁·2024년 6월 17일

알고리즘

목록 보기
69/72

프로그래머스 Lv2 - 가장 큰 수 문제

프로그래머스 알고리즘 고득점 Kit 카테고리의 정렬 문제 중 레벨 2 가장 큰 수 문제를 풀이했다.

지난번에 공부했던 Comparator 익명 클래스를 통해 compare() 메소드를 재정의하여 풀면 될 것 같았다.
정렬 기준은 기본적으로 오름차순 정렬을하고 compare 메소드에서 인자로 가지고 있는 s1, s2를 각 다른 순서로 더했을 때 더 큰 값을 우선 정렬하는 방식으로 재정의했다.

그런데 계속 11번 테스트케이스에서만 실패하길래 내가 찾지 못하는 반례가 있나? 고민하다가 현재 로직에서는 인자로 주어진 numbers 배열에 0만 들어 있을 경우에는 answer변수에 0이 여러개 들어 있을 것 같다는 생각을 했고, 마지막 리턴문처럼 0으로 시작한다면(오름차순 정렬인데 0이 맨 처음에 있다는 것은 answer 문자열은 0들로만 구성되어 있다는 생각..!) 그냥 0을 리턴할 수 있도록 삼항연산자를 사용하여 반례를 해결할 수 있었다.

BiggestNum.java

package com.example.Programmers.Lv2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 프로그래머스 Lv2 - 가장 큰 수
 * 정렬 문제 Comparator 인터페이스 compare 메소드 재정의 활용 풀이
 */
public class BiggestNum {
    public String solution(int[] numbers) {
        StringBuffer answer = new StringBuffer();
        List<String> list = new ArrayList<>();

        // 정렬할 리스트 초기화(String으로 형변환)
        for (int num : numbers) {
            list.add(num + "");
        }

        // Comparator를 사용한 사용자 정의 정렬
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                // 두 요소를 더했을 때 더 큰 숫자를 기준으로 내림차순 정렬
                return (s2 + s1).compareTo(s1 + s2);
            }
        });

        // 정답을 추출하기위해 리스트 내 문자열 더하기
        for (String a : list) {
            answer.append(a);
        }

        // 만약 정답이 0으로 시작한다면 답은 0이기 때문에 0리턴
        return answer.toString().startsWith("0") ? "0" : answer.toString();
    }
}

BiggestNumTest.java

package com.example.Programmers.Lv2;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class BiggestNumTest {
    @Test
    public void testBiggestNum() {
        BiggestNum b = new BiggestNum();

        String result1 = b.solution(new int[] { 6, 10, 2 });
        String result2 = b.solution(new int[] { 3, 30, 34, 5, 9 });
        String result3 = b.solution(new int[] { 0, 0, 0 });

        assertEquals("6210", result1);
        assertEquals("9534330", result2);
        assertEquals("0", result3);
    }
}
profile
나의 개발로그

0개의 댓글