문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
나의 풀이
이번 문제의 관건은 주어지는 숫자의 정렬에 있었는데, 내가 접근한 방법은 숫자 두 가지를 조합할 때 어떤 숫자를 앞에 두는게 더 큰지를 비교하는 비교기를 구현하고, sort 함수에 넣어주는 것이었다. 사실 이 문제풀이를 별도의 클래스에 비교기를 구현하고 정렬하였는데 코드의 동작 방식은 똑같았지만 코드가 너무 길어졌다.. 다른 사람의 풀이를 보고 코드를 정리하였는데, 값들을 별도의 객체가 아니라 String배열에 바로 저장하고, sort 매서드에 비교기를 매개 변수로 넣어주니 훨씬 간결해졌다. 오류가 있을 수 있는 부분이라면 비교기 안에 compare함수 리턴값을 (s2+s1).compare(s1+s2) 로 해주거나 -(s1+s2).compare(s2+s1) 해줘야 한다는 부분일 것이다.
기타
이번 문제풀이에서 궁금했던 점이 있다면, 'String에서 비교함수는 어떤 규칙으로 구현되어 있을까' 였다. 물론 a, b, c와 같이 알파벳이라면 아스킷 코드에 따라 당연히 a보단 b가 b보단 c가 작은 값이겠지만, 문자에 숫자가 포함되어 있을 때가 궁금했다. 예를 들어 3, 4, 30, 31, 33, 34, 39, 300, 303 이 숫자가 int 타입이나 float 타입처럼 숫자가 아니라 문자(String)로 되어 있다면 정렬은 어떻게 이루어 질까? 이에 대해 내가 찾아본 해답을 아래에 나름 정리해 보았다.
https://coder9084.tistory.com/50
코드
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
String[] arr = new String[numbers.length];
for(int i=0; i<numbers.length; i++) {
arr[i] = String.valueOf(numbers[i]);
}
Arrays.sort(arr,new Comparator<String>(){
@Override
public int compare(String s1, String s2) {
return (s2+s1).compareTo(s1+s2);
}
});
StringBuilder sb = new StringBuilder();
for(String str : arr) {
sb.append(str);
}
answer = sb.toString();
return answer.charAt(0)=='0' ? "0" : answer;
}
}
'Algorithm > Programmers-Algorithm' 카테고리의 다른 글
Programmers 모의고사 java 풀이 (0) | 2020.08.14 |
---|---|
Programmers H-Index java 풀이 (0) | 2020.08.13 |
Programmers 이중 우선순위 큐 java 풀이 (0) | 2020.08.12 |
Programmers 디스크 컨트롤러 java 풀이 (0) | 2020.08.11 |
Programmers 스택/큐 프린터 풀이 (0) | 2020.08.09 |