코딩테스트/프로그래머스

[JS] 가장 큰 수

joycie416 2024. 10. 2. 11:08
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 이해

이 문제는 주어진 숫자를 잘 조합해서 가장 큰 수를 만드는 문제이다. 그래서 기본적으로 내림차순 정렬을 해야하지만, 320과 32이 주어진 경우 32320이 32032보다 더 크다는 것에 유의해야 한다. 그래서 이 문제는 sorting을 조금 더 효율적으로 다룰 수 있는지 확인할 수 있는 문제인 것 같다.

 

먼저 내 첫 풀이는 맞는 풀이인 것 같지만 너무 시간이 오래 걸려서 시간 초과로 실패했다. 그래서 다른 사람 코드를 참고했다. 다른 분들 풀이를 보니 아이디어가 대단해보였다. ㅜ

 

방법 1

이 방법은 위에 유의할 점을 그대로 적용한 코드이다. 문자열로 변환하고, 문자열의 순서를 비교하는 코드라서 시간이 굉장히 오래 걸린다는 단점이 있다.

 

맨 처음에 while문으로 뒤에 따라오는 0을 제거하고 크기가 같으면 `b - a`로 내림차 순 정렬했고, 만약 0을 제거한 후에도 다른 숫자라면 문자열 순으로 내림차 순 정렬하도록 했다.

function solution(numbers) {
  numbers.sort((a, b) => {
    let [tmpA, tmpB] = [a, b];
    while (tmpA % 10 === 0 && tmpA !== 0) {
      tmpA /= 10;
    }
    while (tmpB % 10 === 0 && tmpB !== 0) {
      tmpB /= 10;
    }
    console.log(tmpA, tmpB);

    if (tmpA === tmpB) {
      console.log(tmpA, tmpB);
      return b - a;
    } else {
      return a.toString().localeCompare(b.toString());
    }
  });
  console.log(numbers.reverse().join(''));
  const answer = numbers.reverse().join('');

  if (answer[0] === '0') {
    return '0'
  }
  return answer;
}

 

방법 2

다른 사람이 올린 파이썬 코드를 JS로 바꾸었다. 이 문제는 `numbers`의 원소가 0과 1000 사이에 있다는 것을 고려해서 만든 풀이이다.

 

주어진 숫자를 문자열로 바꾸어 4번 반복한 후 앞 4자리의 크기를 비교해 그 기준으로 내림차순 정렬하는 방법이다. 이렇게 하면 끝자리에 0이 들어간 숫자도 길이로 판별할 수 있다.

function solution(numbers) {
  const tmp = numbers.map((num,i) => [num.toString().repeat(4).slice(0,4),i])
  tmp.sort()
  const answer = tmp.reverse().map(arr => numbers[arr[1]]).join('');
  
  if (answer[0] === '0') {
    return '0'
  }
  return answer;
}

 

`tmp`는 2차원 배열인데 `sort()`를 하면 첫번째 원소를 기준으로 정렬해준다. 중간에 `console.log(tmp)`를 추가해서 확인해보면 알 수 있다.

 

방법 3

이 방법을 보고 기발하다고 생각했다. 비교하는 두 숫자를 앞뒤로 이어붙인 후 크기를 비교해 전체 배열을 내림차순 배열하는 방법이다.

function solution(numbers) {
  let answer = numbers.map(v=>v+'')
                      .sort((a,b) => (b+a)*1 - (a+b)*1)
  answer = answer.join('');               

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

const n = [3, 30, 34, 5, 9, 0];
console.log(solution(n));

 

 

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[JS] 큰 수 만들기  (1) 2024.10.09
[JS] 숫자 변환하기 (+DFS, BFS, DP)  (0) 2024.09.27
[JS] 피로도  (0) 2024.09.19
[JS] 의상 (+ 배열 `reduce` 메소드)  (0) 2024.09.12
[JS] 괄호 회전하기  (0) 2024.09.06