[프로그래머스] 고득점 kit - 정렬 - 가장 큰 수

엘크·2023년 9월 27일
0
post-custom-banner

문제 설명


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) {
    // 숫자들을 문자열로 변환
    let strNumbers = numbers.map(num => num.toString());
    
    // 문자열로 변환한 숫자들을 서로 연결하여 비교하는 방식으로 정렬
    strNumbers.sort((a, b) => (b + a) - (a + b) > 0 ? 1 : -1);
    
    // 정렬된 문자열들을 연결하여 결과를 생성
    let answer = strNumbers.join('');
    
    // 예외사항) 만약 모든 숫자가 0이라면 "0"을 반환
    return answer[0] === '0' ? '0' : answer;
}

Code Flow


생각하기

  • 정수가 주어진것들이 string 처리 되었을때, 가장 큰 수를 찾는 방식.
  • 생각해보니까 이거, 문자열로 치환하고 sort(b-a)쓰면 역사전순 치환되니까, 가장 큰 사전순으로 나오지 않을까?
  • 먼저 number에 들어있는 아이들을 ,을 기준으로 잘라내주고, 그다음 모두 string으로 바꾼 후에
  • 역사전순으로 sort 정렬해주고, 그걸 join 해서 answer에 넣으면 해결되는게 아닐까?

풀이하기
1. 숫자열을 먼저 문자열로 변환해준다, map을 이용해서.
2. 그 다음 문자열로 변환된 숫자들을 내림차순으로 했더니, 문제가 발생. 전 문제 기준으로 생각해서, 문자열을 서로 연결해서 비교하는 방식으로 수정하였다.
3. 그 다음 정렬된 문자들을 join()을 이용해서 하나로 붙여주면 완성.
4. 문제는 여기서 발생, undefined가 뜨길래 왜 일까 하고 고민하다가 찾아보니, 0이 들어갔을때 오류가 나는걸로 나옴. 그래서 0이 들어가있다면, 그냥 0을 반환하는걸로 했음.

다른 해답은 없을까?


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

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

배울점

1. `map` 함수에서 `(v => v+'')`를 아직 이해 못한듯. 이게 `toString`이랑 똑같다는데. 흠.

2. `sort()`에서 *1을 해주면 다시 숫자열로 변환한다고 함. 이것도 몰랐다.
profile
꾸준하게 하면 된다 언젠가는..?
post-custom-banner

0개의 댓글