문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
입출력 예 설명
- [1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다.
- [2, 3, 5, 6]의 세 번째 숫자는 5입니다.[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
- [1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.
풀이
💡 숫자를 정렬 → 크기순이 아닌 유니코드의 역순으로 정렬을 해야 한다. [6, 10, 2] -> [6, 2, 10]
💡 Number to String → 숫자 연산이 아닌 문자열의 병합이 되야한다.
1️⃣ 배열의 원소를 map메소드를 이용해 String으로 바꿔준다.
* 두번째 입출력 예를 대입해 보았다.
numbers = [3, 30, 34, 5, 9];
function solution(numbers) {
var answer = numbers.map(n => n.toString());
return answer;
}
solution(numbers); // [ '3', '30', '34', '5', '9' ]
2️⃣ 두 문자열을 더한 값을 비교하여 역순으로 정렬해 준다.
numbers = [3, 30, 34, 5, 9];
function solution(numbers) {
var answer = numbers.map(n => n.toString()).sort((a,b) => (b+a) - (a+b));
return answer;
}
solution(numbers); // [ '9', '5', '34', '3', '30' ]
3️⃣ 문자열을 join 메서드로 합쳐준다.
function solution(numbers) {
var answer = numbers.map(n => n.toString()).sort((a,b) => (b+a) - (a+b)).join('');
return answer;
}
solution(numbers); // '9534330'
4️⃣ 모든 원소가 0일 경우에는 '0'을 리턴해준다. (테스트에서 실패 떴던 부분)
- 모든 원소가 0이 아니라면 배열의 첫번째 원소가 0일 경우는 존재하지 않는다.
- 모든 원소가 0이라면 배열의 첫번째 원소는 0일 수 밖에 없다.
- 삼항 연산자로 분기처리를 해준다. 첫번째 원소가 0이면 문자열 0을 반환하고 아니면 answer 그대로 반환한다.
function solution(numbers) {
var answer = numbers.map(n => n.toString()).sort((a,b) => (b+a) - (a+b)).join('');
return answer[0] === '0' ? '0' : answer;
}
solution(numbers); // '9534330'
✔️ 놓쳤던 부분
- sort에 비교 함수를 넣지 않고 역정렬을 시켰을 때 330이 아닌 303으로 정렬되기 때문에 주어진 조건을 만족시키지 못한다.
numbers = [3, 30, 34, 5, 9];
numbers.map(n => n.toString()).sort().reverse().join('');
solution(numbers); // '9534303'
🧶 복습_sort메소드의 compareFunction [ 참고: MDN sort() ]
- compareFunction이 없을 경우 요소를 문자열로 변환하고, 유니 코드 순서대로 문자열을 비교하여 정렬된다.
- compareFunction이 있을 경우 배열 요소는 compare 함수의 반환 값에 따라 정렬된다.
- compareFunction(a, b) < 0 ➡️ [a, b]
- compareFunction(a, b) = 0 ➡️ a, b 변경 X
- compareFunction(a, b) > 0 ➡️ [b, a]
- compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야 한다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않는다.
출처 : 프로그래머스
'코딩테스트' 카테고리의 다른 글
Level1_비밀지도 (0) | 2020.09.03 |
---|---|
Level1_K번째 수 (0) | 2020.06.16 |
Level1_가운데 글자 가져오기 (0) | 2020.06.11 |
Level1_완주하지 못한 선수 (0) | 2020.06.09 |
Level1_약수의 합 (0) | 2020.06.09 |