송민준의 개발노트

가장 큰 수 본문

알고리즘/프로그래머스

가장 큰 수

송민준 2021. 2. 13. 23:27

programmers.co.kr/learn/courses/30/lessons/42746

 

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

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

programmers.co.kr

 

문제가 쉬운 것 같으면서도 조금 헷갈림

규칙을 찾아내서 정렬 후 합쳐서 리턴.

 

마지막 11번 케이스가 실패해서 뭔가 봤더니

[0, 0, 0, 0, 0]으로 들어온 경우임.

마지막에 리턴 시에 해당케이스 체크함.

/**
 *  프로그래머스 lv2
 *  가장 큰 수
 *  1. 배열의 값을 string으로 변환 후 
 *  2. 비교하고자 하는 값이랑 더해서 숫자형으로 파싱하고 비교해서 정렬
 *  3. 정렬된 것을 합침
 *  - 0으로만 들어온 경우가 있음.(return시 삼항)
 */
public class LargestNumber {
    public String solution(int[] numbers) {

        String result = Arrays.stream(numbers)
                .mapToObj(String::valueOf)
                .sorted((a, b) ->
                        Integer.parseInt(b + a) - Integer.parseInt(a + b))
                .collect(Collectors.joining());

        return (result.indexOf("0") == 0) ? "0":result;
    }
}

정렬 규칙은 앞뒤 값을 각각 더해보고 둘 중에 큰 값이 앞에 오게 함

 

 

테스트 코드

import org.junit.Test;

import static org.junit.Assert.*;

public class LargestNumberTest {

    @Test
    public void solution() {
        //given
        int[] numbers = {6, 10, 2};

        //when
        LargestNumber ln = new LargestNumber();
        String result = ln.solution(numbers);

        //then
        assertEquals("6210", result);
    }

    @Test
    public void solution2() {
        //given
        int[] numbers = {3, 30, 34, 5, 9};

        //when
        LargestNumber ln = new LargestNumber();
        String result = ln.solution(numbers);

        //then
        assertEquals("9534330", result);
    }

    @Test
    public void solution3() {
        //given
        int[] numbers = {0, 0, 0, 0, 0};

        //when
        LargestNumber ln = new LargestNumber();
        String result = ln.solution(numbers);

        //then
        assertEquals("0", result);
    }
}