본문 바로가기

알고리즘(Java)/programmers

[JAVA]가장 큰 수(코딩테스트 고득점 Kit [ 정렬 ]) - LEVEL2

📂문제 설명

 

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

📂아이디어 및 알고리즘(문제풀이)

  • numbers에 있는 값들을 조합하여 최대로 큰 수를 출력하는 문제이다. 조합을 그냥 더해주게 되면 값이 overflow가 나기 때문에 조합하기 전에 String[] 로 만들어 주었다.
  • 매번 조합을 하게되면 시간초과가 발생하기 때문에 Comparator<String>()로 비교하여 String[]요소 끼리 더했을때  가장 크게 되는 값들로 정렬을 해준다.
  • 그리고 모든 배열의 값이 "0"일 경우는 "0"만 출력해 주어야 하므로 그 때의 예외 처리를 해준다.
  • Stringconcat을 이용해 String[]에 들어있는 값들을 더해 준다.

📂소스 코드

 

📂코드 결과

📂후일담

매번 정렬을 해주면서 값을 비교할지 정렬을 미리 해주고 값을 더해서 해줄지에 따라 시간이 많이 차이 난답니다. 

그래서 항상 비교하는 문제는 최대한 반복을 줄일 수 있도록 생각하고 문제를 해결해 주어야 합니다.👊👊