[코테] 프로그래머스 정렬 가장 큰 수

홍인열·2022년 2월 17일
0
post-custom-banner

문제

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

function solution(numbers) {
    let result =''
    // 30 3 이있을때 크기로만 단순히 정렬후 조합하면 경우  '30' + '3' => '303'이 나오기때문에 '330'보다 작아지게된다.
    // 따라서 모두 네자리숫자를 만들어서 비교한다, 이때 4자리 수를 만들기위해 뒤로 첫번째 숫자를 반복시킨다. 30 => 3033, 3 => 3333
    const compare = (a,b) => {// 제한사항에 숫자는 1000 이하라는 조건이있어 모든 숫자를 4자리를 만들어 비교한다.
      if(String(a).padEnd(4,String(a)) > String(b).padEnd(4,String(b))) return -1
      if(String(a).padEnd(4,String(a)) < String(b).padEnd(4,String(b))) return 1
      return 0
    }
    
   numbers.sort((a,b)=>compare(a,b))
  
   result = numbers.join('') //모든 수를 붙인다.
   return result[0]=== '0' ? '0' : result // 첫글짜가 '0'인 경우란, '0000' 이런 경우를 말한다.
 

2

function solution(numbers) {
    let result =''

    
    numbers = numbers.map(number => String(number))
    numbers.sort((a,b)=> b + a - ( a + b )) // 타입이 string으로 변경되었기때문에 이런식으로 정렬을 진행할 수 있다.

   
    result = numbers.join('')
    return result[0]=== '0' ? '0' : result
  

result를 return 할때 '0' 일 경우를 생각해내지 못해 테스트 케이스 하나가 통과되지않아 시간이 오래걸렸다.

return result[0]=== '0' ? '0' : result 
profile
함께 일하고싶은 개발자
post-custom-banner

0개의 댓글