[Node.js_4기] 코드카타 : 가장 큰 수 (24/03/11)

2024. 3. 12. 09:43공부/코테준비

목차

 

1. 문제

2. 시도

3. 결과

4. 배운점

 

1. 문제 

 

코딩테스트 연습 - 가장 큰 수 | 프로그래머스 스쿨 (programmers.co.kr)

 

2. 시도 

 

function solution(numbers) {
    let answer = numbers
    .map(n=>n.toString())
    .sort((a,b)=>(b+a)-(a+b))
    .join('')
    return answer;
}
테스트 1 통과 (130.28ms, 43.4MB)
테스트 2 통과 (67.41ms, 42.2MB)
테스트 3 통과 (167.01ms, 45MB)
테스트 4 통과 (3.86ms, 36.3MB)
테스트 5 통과 (113.46ms, 44.8MB)
테스트 6 통과 (111.35ms, 44.6MB)
테스트 7 통과 (0.15ms, 33.6MB)
테스트 8 통과 (0.13ms, 33.6MB)
테스트 9 통과 (0.13ms, 33.6MB)
테스트 10 통과 (0.13ms, 33.4MB)
테스트 11 실패 (0.21ms, 33.4MB)
테스트 12 통과 (0.08ms, 33.4MB)
테스트 13 통과 (0.05ms, 33.6MB)
테스트 14 통과 (0.07ms, 33.5MB)
테스트 15 통과 (0.05ms, 33.4MB)

케이스 11은 0으로 이루어진 문자열이 생성된다고 한다. 이를 예외처리 해주는 것으로 해결할 수 있다.

 

3. 결과 

 

function solution(numbers) {
    let answer = numbers
    .map(n=>n.toString())
    .sort((a,b)=>(b+a)-(a+b))
    .join('')
    return answer[0]=='0'?'0':answer;
}
테스트 1 통과 (202.95ms, 43.4MB)
테스트 2 통과 (101.62ms, 42.4MB)
테스트 3 통과 (265.22ms, 45MB)
테스트 4 통과 (8.72ms, 36.2MB)
테스트 5 통과 (202.86ms, 45.3MB)
테스트 6 통과 (114.98ms, 44.1MB)
테스트 7 통과 (0.14ms, 33.5MB)
테스트 8 통과 (0.13ms, 33.4MB)
테스트 9 통과 (0.23ms, 33.4MB)
테스트 10 통과 (0.21ms, 33.5MB)
테스트 11 통과 (0.20ms, 33.5MB)
테스트 12 통과 (0.08ms, 33.5MB)
테스트 13 통과 (0.06ms, 33.6MB)
테스트 14 통과 (0.07ms, 33.6MB)
테스트 15 통과 (0.09ms, 33.5MB)

삼항 연산자를 사용한 예외처리

 

4. 배운점 

 

그냥 sort()만 사용하면 [1,2,3,100]을 [1,100,2,3]으로 정렬하는 문제가 있다.

 

이를 해결하기 위한 sort((a,b)=>b-a) : 두 값의 차를 계산하여 차가 양수면 b가 앞, 음수면 a가 앞.

조합이 아닌 각 숫자간의 비교. 

  • a=100,b=3일때 b-a로 비교한다면['100','3']으로 정렬된다.
  • 하지만 '100'+'3' 보다는 '3'+'100'이 더 큰 숫자이다. ('1003'<'3100')

sort((a,b)=>(b+a)-(a+b)) : 'ba'와 'ab'의 연결을 계산한다. 

  • 결과가 음수이면 정렬된 배열에서 b가 a 앞에 와야 함을 의미한다.
  • 결과가 양수이면 정렬된 배열에서 a가 b 앞에 와야 한다는 의미한다.
  • 결과가 0인 경우 순서는 변경되지 않는다.

 

예시 ) 

a=1, b=2

(b + a) - (a + b) => (21)-(12) = 양수

b는 a 앞에 와야 한다.
a=1111, b=2222

(b + a) - (a + b) => (22221111)-(11112222) = 양수

b는 a 앞에 와야 한다.

a=1,b=1

(b + a) - (a + b) => (11)-(11) = 0 순서를 바꾸지 않는다.