이 문제는 주어진 배열의 숫자를 정렬하고 문자열로 리턴하되 9와 90와 같이 서로 자릿수가 다른 숫자를 비교할 때에 주의해야 한다.
일반적으로 배열의 원소들이 숫자일 경우, 내림차순 정렬을 할 때에 arr.sort((a, b) => b - a); 와 같이 정렬한다.
이렇게 정렬하면 [100, 9] => 1009 와 같이 리턴하게 될 것이다. 하지만 1009보다 9100이 더 큰 숫자이다.
이 문제는 100 이 9보다 뒤에 위치해야하는 문제이기 때문에 숫자로 비교하면 안 되고, 각 숫자의 첫번째 글자부터 마지막 글자까지 문자열의 아스키코드를 차례대로 비교하여 정렬해야 한다. 따라서 Javascript 내장함수 sort를 그대로 사용하면 된다. 하지만 각 숫자의 길이가 다르면 비교가 안되기 때문에 각 자릿수를 같게 처리해주어야 한다.
문제에서는 최대 숫자가 1000이라고 했기 때문에 한 자릿수 숫자를 기준으로 최대 3번까지 숫자를 반복해서 늘여서 비교해줄 필요가 있다. 이 부분이 repeat(3)에 해당한다.
그리고 sort는 오름차순 정렬이기 때문에, reverse 함수를 이용해 내림차순으로 다시 정렬해준다.
그리고 현재 정렬된 배열의 숫자들은 각각 길이가 3배로 늘어났기 때문에 다시 원래 숫자대로 만들어준다. 이 부분이
item.slice(0, item.length / 3); 에 해당한다. slice 함수는 첫번째 인자로 주어진 인덱스부터 두번째로 인덱스로 주어진 인덱스의 직전까지 원본을 변경하지 않고 복사해준다.
현재 numbers 배열의 각 숫자들을 join 함수로 연결해준 뒤에 처리해줘야 할 예외가 있다.
바로 0으로만 구성된 배열이 들어왔을 경우 000, 0000 같은 문자열을 0으로 리턴해줘야한다는 것이다.
파이썬에서는 큰 숫자여도 e를 사용하여 표현하지 않았기 때문에 괜찮았지만, 자바스크립트에서는 Number.MAX_SAFE_INTEGER를 초과한 숫자는 정확성을 보장하기 위해서 e를 사용하여 표현하기 때문에 주석으로 처리한 것과 같이 표기하면 테스트 케이스에서는 통과하지만 히든 케이스에서 많은 원소들을 가진 배열을 입력 파라미터로 받게되면 e를 포함한 숫자로 리턴하게 되어 11번을 제외한 다른 케이스들에서 통과하지 못한다. 따라서 값이 0일 경우 '0'을 리턴해주는 예외케이스를 처리해주면 된다.
function solution(numbers) {
let answer = "";
numbers = numbers.map((item) => (item + "").repeat(3));
numbers.sort().reverse();
numbers = numbers.map((item) => item.slice(0, item.length / 3));
answer = numbers.join("");
// 큰 숫자는 e를 사용하여 표현되어 우리가 원하는 형식으로 표현되지 않는다.
// answer = Number(numbers.join('')).toString();
// 따라서 예외적으로 0000 같이 0으로만 구성된 문자열에 대해서 0으로 바꿔줄 필요가 있다.
if (Number(answer) === 0) {
return "0";
}
return answer;
}
https://programmers.co.kr/learn/courses/30/lessons/42746
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
Python => https://limminjeong98.tistory.com/142
'Problem Solving > Programmers - 그외' 카테고리의 다른 글
H-Index Javascript [프로그래머스 정렬] (0) | 2021.07.20 |
---|---|
K번째 수 Javascript [프로그래머스 정렬] (0) | 2021.07.20 |
키패드 누르기 Javascript [프로그래머스] 2020 카카오인턴십 (0) | 2021.07.14 |
비밀지도 Javascript [프로그래머스] 2018 KAKAO BLIND RECRUITMENT (0) | 2021.07.14 |
문자열압축 Javascript [프로그래머스] 2020 KAKAO BLIND RECRUITMENT (0) | 2021.07.14 |