Bin's Blog

[프로그래머스] Level2 - 가장 큰 수(Javascript) 본문

Algorithm

[프로그래머스] Level2 - 가장 큰 수(Javascript)

hotIce 2023. 4. 28. 10:00
728x90
 

프로그래머스

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

programmers.co.kr

▶ 문제 요약

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

2. [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]을 만들 수 있고, 이중 가장 큰 수는 6210이다.

3. 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return하도록 작성

 

▶ 코드

function solution(numbers) {
    // 내림차순 정렬 후 문자열로 변환
    let answer = numbers.sort((a, b) => 
    `${b}${a}` - `${a}${b}`).join("");
    // 입력 배열이 다 0인 경우 0을 return
    return answer[0] === "0" ? "0" : answer;
}

▶ 풀이 과정

1. sort()메서드를 활용해서 정렬을 하는데 가장 큰 수를 정렬해야하므로 내림차순 정렬을 한다. 오름차순은 a-b이고 내림차순은 b-a이다. 

예를 들어 [6, 10, 2]가 있다고 하자. 정렬을 할 때 템플릿 리터럴을 사용해서 두 비교값을 하나의 문자열처럼 합쳤다. 

처음에 6과 10을 비교하면 a = 6, b = 10이다. 그래서 106 - 610이 되는데 이러면 음수가 나온다. 근데 내림차순 특성상 양수가 나와야 정렬이 이루어진다. 따라서 배열의 상태가 유지된다. 

그리고 다음 값인 10과 2를 비교하면 a = 10, b = 2 그래서 210 - 102가 되면서 양수가 된다. 양수가 나왔으므로 정렬이 이루어져서 10과 2의 자리가 교체된다. 따라서 [6, 2, 10]이 되고 그것을 문자열로 바꿔야 하므로 join() 메서드를 활용했다.

 

2. answer[0]이라는 조건은 첫 번째 문자가 0이면 정렬된 배열의 모든 요소가 0이라는 의미 즉 이 말은 내림차순을 했음에도 가장 앞자리의 수가 0이라는 의미는 0보다 큰 수가 뒤에 없다는 의미가 성립되므로 이럴땐 문자열 0을 return하고 그게 아니면 위에서 정렬한 문자열을 return한다.

 

▶ 배운점

1. 문자열을 비교할 때 템플릿 리터럴을 적극적으로 활용하자. 매우 유용하다. 특히 가장 큰 수를 만드는 경우에는 정렬할 때 템플릿 리터럴을 사용하면 좋다. 

 

2. 입력값이 0인 경우가 나올 수 있으므로 항상 예외 케이스를 고려해야한다. 

728x90