참고
문제해설
문제 로직고민
NOTE
•
가장 큰 숫자는 단순하게 큰 값이 앞에 들어가면된다.
◦
단 숫자의 범위는 0~1000범위이므로 조심해야 한다.
◦
8보다 10이 크지만, 8이 앞에있는것이 더 좋기 때문
◦
또한 30, 34의 경우 뒤의 숫자까지 생각해서 정렬해야 한다.
•
위의 상황들을 고려해서 정렬하는 조건은 다음과 같다.
1.
2개의 숫자를 char[] 배열로 변경한다.
2.
두 배열을 앞에서 부터 비교해나가며, 차이가 생긴다면 비교값을 반환한다.
3.
두 배열의 길이가 다른경우, 짧은 배열은 마지막값을 계속 사용한다.
•
34, 345의 경우 34보다 345가 더 크다고 판단한다.
4.
만약 비교과정이 모두 동일하게 나온다면 더 길이가 긴걸 반환한다.
•
34, 344의 경우 344를 더 크다고 판단한다.
•
위의 과정까지 진행했는데 오답이 나와 반례를 찾았다.
◦
출력 ⇒ 566, 56, 565, 555, 55, 5, 549, 544, 54
◦
정답 ⇒ 566 56 565 5 55 555 549 54 544
◦
4번과정인 경우 더 긴 숫자를 더 크다고 판단했는데, 상황마다 달라진다.
◦
마지막 값이, 처음 숫자보다 크면 길이가 긴것을, 작으면 짧은것을 먼저 나오도록 수정했다.
•
여전히 실패.. 힌트를 보러갔다.
작성코드
NOTE
import java.util.*;
class Solution {
public String solution(int[] numbers) {
Integer[] nums = Arrays.stream(numbers).boxed().toArray(Integer[]::new);
Arrays.sort(nums, (n1, n2) -> {
char[] s1 = String.valueOf(n1).toCharArray();
char[] s2 = String.valueOf(n2).toCharArray();
int length = Math.max(s1.length, s2.length);
for(int i=0; i<length; i++){
char c1 = i < s1.length ? s1[i] : s1[s1.length - 1];
char c2 = i < s2.length ? s2[i] : s2[s2.length - 1];
int diff = c2 - c1;
if(diff != 0) return diff;
}
if(s1[0] < s1[s1.length-1]) return s2.length - s1.length;
else return s1.length - s2.length;
});
if (nums[0] == 0) return "0";
StringBuilder sb = new StringBuilder();
for(int i : nums){
sb.append(i);
}
return sb.toString();
}
}
Java
복사
테스트케이스 1~6 실패
public class Solution {
public String solution(int[] numbers) {
String[] arr = new String[numbers.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = String.valueOf(numbers[i]);
}
// ?? 이게된다
// 문자열은 정렬계산에서 문자열 앞부터 자동으로 비교하기에 가능
Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
if (arr[0].equals("0")) {
return "0";
}
StringBuilder answer = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
answer.append(arr[i]);
}
return answer.toString();
}
}
Java
복사
저 간단한걸 왜 안햇지
•
정렬 과정에 대한 풀이
1.
"10"과 "6"을 비교: "610" vs "106" -> "610"이 더 크므로 "6"이 "10"보다 먼저 옵니다.
2.
"6"과 "2"를 비교: "62" vs "26" -> "62"가 더 크므로 "2"가 "6"보다 뒤에 옵니다.
3.
"10"과 "2"를 비교: "210" vs "102" -> "210"이 더 크므로 "2"가 "10"보다 뒤에 옵니다.
다른사람 풀이
NOTE
import java.util.*;
import java.util.stream.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
answer = Arrays.stream(numbers)
.mapToObj(String::valueOf)
.sorted((s1, s2) -> -s1.concat(s2).compareTo(s2.concat(s1)))
.reduce("", (s1, s2) -> s1.equals("0") && s2.equals("0") ? "0" : s1.concat(s2));
return answer;
}
}
Java
복사
스트림 코드
•
프로그래머스에서 스트림 장인이 1명씩 꼭 있는것 같다.