가장 큰 수 찾기

YEONGHUN KO·2021년 11월 29일
0

ALGORITHMS - PRACTICE

목록 보기
23/50
post-thumbnail

1. 가장 큰 수 찾기

array가 주어지고 그 안에 숫자가 주어진다. 그 숫자의 조합을 통해서 가장 큰 숫자가 무엇인지를 출력하면 된다. 예를 들어, [6,10,2] 라는 배열이 있으면 이 배열을 조합해서 숫자를 만든다. 조합해서 만들 수 있는 숫자중에 가장 큰 숫자는 '6210' 이다.

2. 접근 방법

  • pseudo code
    • 앞자리 숫자를 비교한다.
    • 앞자리 숫자가 같으면 뒤자리 수가 0으로 끝나는지 알아본다
    • 0으로 끝나면 0으로 끝나는 숫자가 뒤에 가고 아닌숫자는 앞으로 온다.

그러니깐 만약에 앞자리가 같은 숫자, 64,60이 있으면 6460처럼 나열한다는 뜻이다. 그럼 로직을 짜보자

function solution(numbers) {
  let sorted = numbers.sort().reverse();

  var answer = "";

  for (let i = 0; i < sorted.length; i++) {
    sorted[i] = sorted[i].toString();
  }

  for (let j = 0; j < sorted.length - 1; j++) {
    if (sorted[j][0] === sorted[j + 1][0]) {
      if (sorted[j][sorted[j].length - 1] === "0") {
        let temp = sorted[j];
        sorted[j] = sorted[j + 1];
        sorted[j + 1] = temp;
      }
    }
  }

  return sorted.join("");
}

근데 테스트를 해보니 3개빼고 다 틀림 ㅋㅋㅋㅋ 문제가 뭘까? 일단 다른 분들 코드를 보았는데 역시나 내 코드에 통과되지 않는 예외케이스가 있을거다. 단순히 0으로 끝나는 숫자를 뒤로 보낸다고 해결 되지 않는 경우말이다.

그럼 답안을 보자!

function othersolution(numbers) {
  let answer = numbers
    .map((c) => "" + c)
    // sort하는 방법이 관건이었구나...
    // 문자형태의 숫자도 계산이 가능하다

    .sort((a, b) => b + a - (a + b))
    .join("");

  return answer[0] === "0" ? "0" : answer;
}

진리는 쉽고 단순하다... ㅋㅋㅋ sort를 저런식으로 할 줄은 생각못했다. 예를 들어 a:30 / b:3이라면 이어붙였을 때 330-303 가 된다. 이때 양수이면 a가 뒤로 간다 만약 음수이면 앞으로 간다. 정렬과정을 숫자로 나타내보겠다

numbers[0],[1]을 비교시작
[3,30,34,5,9]

numbers[1],[2]을 비교시작
[3,34,30,5,9]

numbers[2],[3]을 비교시작
[34,3,30,5,9]
[34,3,5,30,9]
[34,5,3,30,9]
[5,34,3,30,9]

numbers[3],[4]를 비교시작
[5,34,3,9,30]
[5,34,9,3,30]
[5,9,34,3,30]
[9,5,34,3,30]

항상 생각해야한다. 과연 이 분은 어떻게 해서 이런 쌈박한 코드를 짤 수 있었는지. 양적 승부인건지, 시각화인건지 아님 다른 방법이 있는건지. 배울 수 있음에 감사하다.

profile
'과연 이게 최선일까?' 끊임없이 생각하기

0개의 댓글