-
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고,
이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 조건
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
문제 풀이
function solution(numbers) { let strings = numbers.map(num => num + ""); const answer = strings.sort((a, b) => (b + a) - (a + b)).join(""); return answer[0] === "0" ? "0" : answer; }
풀이입니다.
방식만 이해하면 간단한 풀이었습니다.
우선 strings 변수에 map()을 이용하여 배열의 숫자를 문자열로 변환하여 배열을 만들어줍니다.
그 후에 sort((a, b) => (b + a) - (a + b)) 을 이용하여 큰수의 조합 순으로 정렬해줍니다.
예를 들어 ["6", "10", "2"] 라고 치면 처음 a는 "6" b는 "10"이니까 106 - 610은 음수값이 나오니까
순서가 바뀌지 않습니다. 반대로 "10"과 "2"는 210 - 102가 되면 양수값이 나오기 때문에 순서가 바뀌어서 정렬됩니다.
그렇게 ["6", "2", "10"] 으로 정렬이 완료되면 join("")을 이용하여 "6210"을 만들어주면 됩니다.
마지막에 answer[0]이 "0" 일 경우에는 그냥 "0"을 리턴해주면 되는데
일종의 방어코드로 만약 numbers 배열 인자가 [0,0,0,0] 이런식이면 answer에 "0000"이 할당되기 때문에
이런 경우에는 "0"을 리턴해주어야 하기 때문에 해당 코드를 추가해줬습니다.
다른 사람들의 풀이
function solution(numbers) { if (numbers.reduce((a, b) => a + b) === 0) { return "0"; } else { let answer = numbers.sort((i, j) => { return String(j).repeat(4).slice(0, 4) - String(i).repeat(4).slice(0, 4); }); let result = answer.map((s) => String(s)).join(""); return result; } }
'코딩 기록 > 자바스크립트 알고리즘' 카테고리의 다른 글
(자바스크립트 알고리즘) 피보나치 수 - kimyang-sun (0) 2020.11.29 (자바스크립트 알고리즘) H-Index - kimyang-sun (0) 2020.11.29 (자바스크립트 알고리즘) 다리를 지나는 트럭 - kimyang-sun (0) 2020.11.24 (자바스크립트 알고리즘) 프린터 - kimyang-sun (0) 2020.11.24 (자바스크립트 알고리즘) 위장 - kimyang-sun (0) 2020.11.23 댓글