📖 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42746
더보기
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
🔑 풀이
베꼈어요... 처음에는 단순하게
- String[]으로 변환한다
- 3, 34, 30처럼 3으로 시작하는 수가 있는 경우 3을 33으로 치환한다
- 배열을 정렬하고 33을 3으로 다시 변환한다
- 배열을 합하여 출력한다
이렇게 풀었는데 979, 97인 경우에는 해당 알고리즘 결과 97979가 되어 테케 1~6이 실패함(97997이 되어야 맞음)
이 처리를 해도 또 틀릴 것 같아서 그냥 구글링해서 베꼈습니다..
import java.util.*;
class Solution {
public static String solution(int[] numbers) {
String[] arr = new String[numbers.length];
// String으로 변환
for (int i = 0; i < arr.length; i++) {
arr[i] = String.valueOf(numbers[i]);
}
// 사전순 비교. 순서를 바꿔가며 합쳐 정렬한다.
Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
// 0..0인 경우는 0을 반환
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();
}
}
** 문제에서 숫자 1000 이하로 제한해서 3을 3333으로 치환하면 내 풀이로 풀린다고 함 ㅋ
문제를 잘읽자 ~
'알고리즘' 카테고리의 다른 글
[프로그래머스] 게임 맵 최단거리 (java) (0) | 2023.06.26 |
---|---|
[프로그래머스] 타겟넘버 (java) (0) | 2023.06.24 |
[프로그래머스] K번째수 (java) (0) | 2023.06.21 |
[이코테] Chapter 6. 정렬 (java) (0) | 2023.06.19 |
[백준] 2331. 반복수열 (java) (0) | 2023.06.15 |