DEVELOP
article thumbnail

가장 큰 수 #42746

 

프로그래머스

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

programmers.co.kr

더보기

문제 설명

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"

나의 풀이

function solution(numbers) {
  const arr = numbers.sort((a, b) =>
    a[0] !== b[0]
      ? a[0] - b[0]
      : (b.toString() + a.toString()) - (a.toString() + b.toString())
  );

  return arr[0] === 0 ? "0" : arr.join("");
}
  • 자바스크립트의 sort함수에는 옵션을 지정해줄 수 있다. 
  • 옵션을 지정해주지 않으면 가장 앞자리에서부터 비교한다. (수 비교 시 옵션 필수로 지정해주어야 하는 이유) 
  • 내가 생각한 방법은
    • 수의 가장 앞자리가 같지 않으면 앞자리가 더 큰수가 앞으로 가도록 (내림차순) 정렬하고,
    • 수의 가장 앞자리가 같으면 두 수를 string으로 변환 후 더하여 문자열로 만들어 준뒤 비교하여 더 큰 수가 앞으로 가도록 정렬했다.
  • 그리고 만약 numbers가 [0,0,0] 이라면 000이 아닌 0이 출력되게 하기 위해 정렬 후 배열의 첫번째 값이 0이면 "0"을 출력하고,
  • 0이 아니면 arr을 ""으로 join하여 string으로 리턴해주었다. 

다른 풀이

function solution(numbers) {
  const answer = numbers.sort((a, b) => `${b}${a}` - `${a}${b}`).join("");
  return answer[0] === "0" ? "0" : answer;
}
  • 나의 풀이에서는 앞자리가 같은지를 비교하고, 문자열로 바꾸느라 비효율적인 코드였는데,
  • 생각해보면 앞자리가 같던 다르던 두 수를 문자열로 바꾸고 비교하여 정렬해주는 것이 더 간단한 방법이다. 
  • 또한 굳이 toString을 쓸 필요 없이, 백틱 안 중괄호 안에 수를 넣어 비교하여 더 깔끔하고 가독성 좋은 코드가 되었다. 

나의 풀이와 다른 풀이의 비교

profile

DEVELOP

@JUNGY00N