[ALGORITHM NINJA] 정렬 2번 가장 큰 수

NinjaJuunzzi·2021년 5월 17일
0

테스트 케이스 분석

1~6 : [101,10] or [131,13] 같이 내 계산대로 같은 값을 갖는 경우

7~10 : 엄청 큰 수

11 : [0,0] => 0으로 출력되어야함.

내 코드 (7~11 테스트케이스 통과)

function solution {
   let result = "";
  const answer = numbers.map((item, index) => {
    const array = `${item}`.split("");
    let result = array[0] * 1000;
    result += array[1] ? array[1] * 100 : array[0] * 100;
    result += array[2] ? array[2] * 10 : array[0] * 10;
    result += array[3] ? array[3] * 1 : array[0] * 1;

    return {
      result,
      index: index,
    };
  });
  answer.sort((a, b) => {
    if (a.result > b.result) {
      return -1;
    }
    if (a.result < b.result) {
      return 1;
    }
    return 0;
  });
  answer.forEach((item) => {
    result += `${numbers[item.index]}`;
  });
  result = result.replace(/(^0+)/, "");
  return `${result === "" ? "0" : result}`;
}
  • 엄청 큰수를 +result 또는 Number.parseInt(엄청큰수문자열) 하게되면 자연지수형태로 출력됨 (숫자너무커서)

따라서

result = result.replace(/(^0+)/, "");

다음과 같이 모든 왼쪽의 0을 다지우고

return `${result === "" ? "0" : result}`;

빈 문자열인 경우는 0인 경우이므로 0을, 빈 문자열이 아닌 경우는 그대로 리턴해준다.

이렇게 하면 7~11번까지의 테스트케이스는 통과

내 코드 (1~11번 모두 통과)

내 코드는 1이 들어오는 경우

  • 1000의 자리 수 * 1000

  • 100의 자리 수 * 100

  • 10의 자리수 * 10

  • 1의 자리수 * 1

로 가중치를 두어 어떤 숫자가 앞에 오는게 더 큰 수가될지 판별한다.

즉, 내 코드는 앞의 4개의 경우에서 나온 값을 모두 더하였을 때 더 큰 값이 앞에 붙였을 때 더 큰 수라고 판단한다.

하지만 한가지 문제점이 있었다. 내 코드의 경우 가중치에 대한 case는 별로 고려하지 않았다. 가중치가 같은 경우 어떤 게 앞에 와도 상관 없다고 생각하였기 때문이다.

가중치가 같더라도 100의 자리 수가 더 큰지 작은지에 따라 자릿 수가 더 많은 수가 앞에 와야하는지 뒤에 와야하는지 달라진다. 다음과 같이 말이다.

그럼 10의 자릿 수에 대해서는 고민안해도됨 ?

그렇다

ex) [110, ?]에서 110과 같은 가중치를 갖는 수는 무엇이 있을까? 110 밖에 없다. 따라서 같은 수끼리는 뒤에 놓든 앞에 놓든 상관이 없으므로 고려할 필요없다.

하지만 10000까지 정수를 받을 수 있다면 이야기는 달라진다. 110이 들어온다하더라도 같은 가중치의 다른 숫자들이 많기 때문이다.물론 11 같이 같은 가중치의 수가 한 숫자로 되어있는 경우는 제외한다.(앞 뒤로 놓든 상관이 없으므로)

1000 => 1~9 10~99 100~1000 까지 밖에 정수를 못 가지므로 100의 자릿 수만 고려하면 되고
10000 => 1~9 10~99 100~999 1000~10000 까지의 정수를 가지므로 100의자릿수와 1000의자릿수 모두 고민해야한다.

다른 풀이


function solution(numbers) {
    let answer = numbers.sort((a, b) => `${b}${a}` - `${a}${b}`).join('');
    return answer[0] === '0' ? '0' : answer;
}

우선 감탄이 나온다..

compareFunction(a, b)이 0보다 작은 경우 a가 더 작은 값이라 인식하고 앞으로 정렬합니다. 즉, a가 먼저옵니다.

compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다.

compareFunction(a, b)이 0보다 큰 경우, b가 더 큰 값이라 생각하고 a보다 낮은 인덱스로 소트합니다.

sort의 동작방식

  • 오름차순으로 정렬한다면 ? (작은수가 앞으로)
const array = [0, 1, 2, 3];
array.sort((back, front) => {
  if (back > front) {
    // 뒤가 더 크면 자연스러우니깐 1
    return 1;
  }
  if (back < front) {
    // 앞이 더 크면 부자연스러우니깐 -1
    return -1;
  }
  return 0;
});
console.log(array); // [0,1,2,3]
  • 내림차순으로 정렬한다면 ? (큰수가 앞으로)
const array = [0, 1, 2, 3];
array.sort((back, front) => {
  if (back > front) {
    // 뒤가 더 크면 부자연스러우니깐 1
    return -1;
  }
  if (back < front) {
    // 앞이 더 크면 자연스러우니깐 -1
    return 1;
  }
  return 0;
});
console.log(array); //[3,2,1,0]

상황에 맞게 자연스러운데로 생각하자 !! (헷갈리니깐 🤪)

Reference

profile
Frontend Ninja

0개의 댓글