Search
Duplicate
📒

[Programmers] 04-1. 가장 큰 수 ⭐

상태
완료
수업
Algorithm Solving
주제
Programmers
4 more properties
참고

문제해설

NOTE
입력값 ⇒ 1차원 정수배열
출력값 ⇒ 1차원 정수배열의 값으로 만들 수 있는 가장 수

문제 로직고민

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명씩 꼭 있는것 같다.