[Lv2] 가장 큰 수

Creating the dots·2022년 1월 11일
0

Algorithm

목록 보기
48/65

프로그래머스

나의 풀이 ❌

수도코드

  • 숫자의 가장 큰 자리수부터 비교해 큰 값을 순서대로 정렬하기 위해 numbers 배열의 요소를 문자열로 바꾼다.
  • sort를 사용해 각 자리수를 숫자로 바꾸어 비교한다.
  • 정렬된 배열의 값을 reduce를 사용해 하나의 문자열로 만들어 리턴한다.
function solution(numbers) {
  const strArr = numbers.map((el) => String(el));
  for(let i=0; i<strArr.length; i++){
    strArr.sort((a,b) => Number(b[i]) - Number(a[i]));
  }
  const res = strArr.reduce((acc,cur) => {
    return acc+cur;
  },'');
  return String(res);
}

반복문과 sort를 모두 사용하다보니 시간초과되는 테스트 케이스가 대부분이었고, 테스트케이스도 통과하지 못했다..

찾아본 풀이

이 문제를 푸는데 가장 중요한 세가지가 있다.

  • 숫자를 문자열로 바꾼다.

    • 문자열끼리 더하면 실제로 값이 더해지지 않고 이어붙여진다. 따라서, 이어붙여진 문자열들끼리 크기를 비교하기 위해 문자열로 바꿔주는 과정이 필요하다.
  • sort를 사용해 이어붙여진 문자열의 크기를 비교한다.

    • sort는 a,b가 있을때 compareFunction으로 a-b를 쓰면 오름차순으로 정렬시키고, 반대로 b-a를 하면 내림차순으로 정렬시킨다. 따라서, b+a한 문자열과 a+b한 문자열을 빼서 크기를 비교한다.
    • '숫자'끼리는 뺄셈은 덧셈과 다르게 연산이 된다.
      ex. '4'-'5' = -1
  • 내림차순으로 정렬된 numbers 배열의 첫번째 요소가 0인 경우 '0'을 리턴한다.

function solution(numbers) {
  let answer = '';
  const arr = numbers.map(v => v.toString()).sort((a,b) => (b+a) - (a+b));
  return answer = arr[0]==='0' ? '0' : arr.join("");
}

sort를 사용해야한다는 건 알았지만, 어떤 compareFunction을 작성해야하는지는 생각해내지 못했다. 새로운 방법을 배웠으니 잘 기억해 두어야겠다.

profile
어제보다 나은 오늘을 만드는 중

0개의 댓글