프로그래머스 - 가장 큰 수 (Javascript)
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers | return |
---|---|
[6, 10, 2] | “6210” |
[3, 30, 34, 5, 9] | “9534330” |
풀이 과정
처음에 조금 삽질을 했다…
그냥 sort 함수에서 정방향으로 더한 것과 치환하여 더한 것을 비교만 해주면 되는 문제였는데.. 너무 생각이 많았던 것 같다.
string 두 개를 붙여준 뒤 해당 값의 대소비교를 해줘야 하기 때문에 stringArr를 만들었다.
⇒
numbers.map(num ⇒ num.toString())
이제
string
으로 변환된stringArr
을sort()
를 활용해 정렬해준다.sortFunction
의 원리는 간단하다. 정방향과 치환된 문자열 두 개를 서로 비교해준 뒤, 더 큰 값이 앞으로 정렬되도록 하면 되기 때문이다.
javascript Array.prototype.sort()의 동작원리를 이해해보자
사실 위의 풀이 방법은 자바스크립트 내장 메소드인
sort()
동작 원리를 이해해야 쉽게 이해하고 풀이할 수 있다
1 | const array = [20, 100, 50, 30]; |
근데 왜
b-a
가 내림차순이 되는걸까?sort()
는a
와b
의 연산 후 반환값이 음수면 자리를 바꾸고, 양수면 그대로 둔다는 특성을 갖는다.
이를 이해하고 아래의 정렬 과정을 보면 이해가 쉬울 것이다.
1 | // 차례대로 확인해보자! [20,100,50,30] |
이처럼, return
값이 양수면 그대로 위치를 유지하고, 음수면 자리를 바꿔준다는 로직만 이해하고 있으면 된다.
따라서 a-b
, b-a
일 경우에는 대소비교에 따라 음수 양수 값이 정반대가 되기 때문에 b-a
일 때에는 내림차순 정렬이, a-b
일 때에는 오름차순 정렬이 되는 것이다.
소스코드 (첫 시도… 대실패)
너무 생각이 많았다. 그냥 대소비교를 해주면 될 것을… 뭔가 숨겨진 공식이 있을 것 같아서 머리를 굴리다가 외려 좋지 못한 코드가 나왔다.
1 | function solution(numbers) { |
소스코드 (최종)
그냥 욕심을 버리고 다시 처음부터 생각해봤다.
그냥 간단하게 대소비교만 해주면 된다는 생각에 아래와 같이 간단하게 풀어낼 수 있었다.
1 | function solution(numbers) { |
프로그래머스 - 가장 큰 수 (Javascript)
https://hoonjoo-park.github.io/algorithm/programmers/largestNumber/