알고리즘 문제풀이-가장 큰 수

공부중인 개발자·2021년 9월 3일
0

알고리즘

목록 보기
3/63
post-thumbnail

https://programmers.co.kr/learn/courses/30/lessons/42746

가장 큰 수
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항
numbers의 길이는 1 이상 100,000 이하입니다.
numbers의 원소는 0 이상 1,000 이하입니다.
정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예

numbersreturn
[6, 10, 2]"6210"
[3, 30, 34, 5, 9]"9534330"

수도 코드
1.첫번째 자리를 비교한다. 큰걸 앞으로 간다.
2.같은 게 있으면 두번째 자리를 비교해서 큰게 앞으로 간다. + 두번째자리가 첫번째 자리보다 작으면 뒤로 간다.
3.다 조인으로 뭉치면 끝
이라고 생각했다.

처음 문제풀이

function solution(numbers) {
    let arr = numbers.sort().reverse().map(el => String(el));
    let sortArr = [];
    for (let i = 0; i<arr.length; i++) {
        let length = arr[i].length
        if (length === 1) {
          for (let j = 0; j<sortArr.length; j++) {
            if(arr[i] > sortArr[j][1]) {
              let newArr = [...sortArr.slice(0,j),arr[i],...sortArr.slice(j)]
              sortArr = newArr
            }
          }
        }
      else {
        sortArr.push(arr[i])
      }
    }
    return sortArr.join("")
}

계획은 먼저 sort를 시키고 reverse 시킨 뒤 문자열로 바꾼 배열에서 한자리수의 위치만을 바꿔주는 것이었다.
문제가 되는 사항은 한자리 수의 위치를 어떻게 지정할 것인가에 대한 것이었고 두번째로 무한히 돌아가는 코드였다.

let newArr = [...sortArr.slice(0,j),arr[i],...sortArr.slice(j)]
sortArr = newArr

이 부분이었고 결국 문제를 다 지우고 다른 방법을 풀어보기 위해 노력했지만 문제를 풀지 못했다.

정답

  function solution(numbers) {
    
    var answer = numbers.map(c=> c + '').
    				sort((a,b) => (b+a) - (a+b)).join('');
    
    return answer[0]==='0'? '0' : answer;
}

이걸보고 sort 내장함수를 정확하게 사용할줄 모른다는 것을 깨달았다. 그래서 sort의 구현방법에 대해서 찾아보게됐다.

Javascript Sort함수에 대한 잡지식
그동안 나는 sort를 ((a,b) => a-b) 오름차순만을 사용했었는데 그 구현이 어떻게 되는건지 전혀 이해하지 못하고 있었다.
위의 블로그에서 나온 방법에 대한 내용은 MDN에서 보던것보다 쉬운 예시로 설명되어있었는데
[1,2,3,4,5] 의 배열을 sort 할 때 a,b가 각각 [2,3,4,5], [1,2,3,4] 였단걸 깨달았다.
전까진 그냥 사용만 했는데 a,b의 역할이 내가 알던것과 정반대여서 놀라게 되면서 한편으로 앞으로 sort를 더 잘 활용할 수 있을것 같았다.

profile
열심히 공부하자

0개의 댓글