[PS] 가장 큰 수 (LV2)

프로그래머스 레벨2

가장 큰 수

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) {
  // numbers를 sort함수로 정렬한다
  const answer = numbers
    .sort((a, b) => {
      // 30,34같은 경우에는 34가 앞으로 30이 앞으로 가야하므로
      // b와 a를 String형태로 바꿔준후 더해준다

      /**
       * 1. b(34), a(30) 3430 - 3034
       * 2. b가 앞으로온다
       * 3. 이런식으로 정렬을 마무리 한뒤
       * 4. join으로 숫자형태의 문자열을 만들어준다.
       */
      a = a.toString();
      b = b.toString();

      return b + a - (a + b);
    })
    .join("");

  // 근데 [0,0,0] 은 "0"의 형태로 나와야한다
  // 테스트케이스중 하나가 히든케이스로 계속나와서
  // 100,200 등등.. 다맞아서 그러면 0이 여러개일수도있겟구나 싶어서 삼항연산자로 처리
  // (앞이 0인경우는 0이 연속되는경우 말고 없기에)
  return answer[0] == 0 ? "0" : answer;
}

마무리

정렬

숫자 자릿수를 무작정 비교하려고하니 너무 오래걸리고 코드가 길어져서 다 지우고 그냥 숫자문자열을 더해주면 3430 3034형태가 되니까 두개를 비교하면 되겟구나 싶어서 (b+a) - (a+b) 형태로하니까 테스트케이스 1개에서 계속 틀렷다

아무리 테스트케이스를 추가해도 전부 맞아서 제한사항을 확인하니 0 또는 양의정수가 담긴 배열이라
[0,0,0,0,0,0,0] 형태면 "0000000"이 나오는걸 확인해서 삼항연산자로 0이 나오게 처리했다.

좋은 웹페이지 즐겨찾기