CS/알고리즘

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

infitry 2022. 7. 2. 05:58
반응형

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항
  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예numbersreturn
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

 

 

문제 풀이

String의 메소드 중 compareTo를 사용하여 비교하면 해결할 수 있다.

"9" 와 "20"을 비교한다고 하면, 각각 String의 같은 index에 있는 문자들의 아스키코드 값을 빼서 결과를 리턴한다.

자리수가 다르면 같은 자리까지만 비교한다.

예를 들어 9와 20을 비교하면 첫 번째 자리인 9와 2를 비교하여 뺀 값 7을 리턴한다.

해당 문제에서는 30과 3을 비교할 때 어떻게 문자열을 만들면 더 큰 가를 비교해야 하기 때문에

"30" + "3" = "303", "3" + "30" = "330" 해서 "303" 을 비교하여 3이 결과로 리턴된다.

"000"으로 문자열이 나올 경우도 있기 때문에 첫 자리가 "0"이면 "0"만 반환하도록 처리

 

String answer = "";
answer = Arrays.stream(numbers)
        .mapToObj(String::valueOf)
        .sorted((s1, s2) -> (s2 + s1).compareTo(s1 + s2))
        .reduce("", (s1, s2) -> s1.equals("0") && s2.equals("0") ? "0" : s1 + s2);
return answer;
반응형