LeetCode - 2160. Minimum Sum of Four Digit Number After Splitting Digits

henu·2023년 9월 2일
0

LeetCode

목록 보기
39/186
post-thumbnail

Solution

var minimumSum = function(num) {
    const digits = [...String(num)].map(e => +e).sort((a,b) => a-b)

    return 10 * (digits[0] + digits[1]) + digits[2] + digits[3]
};

Explanation

일단 Number 타입인 num의 각 자릿수를 분리하기 위해서 String으로 변환하였다. 그리고 각 자릿수를 요소로 갖는 배열로 전환한 후 map를 이용해 다시 Number 타입으로 변환 후 오름차순으로 정렬하였다.
이 상황에서 문제의 태그로 적혀있는 Greedy 알고리즘이 필요한 것 같다.
Greedy Algorithm(탐욕 알고리즘)이란 간단하게 설명하면

탐욕 알고리즘은 최적해를 구하는 데에 사용되는 근사적인 방법으로, 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다. 순간마다 하는 선택은 그 순간에 대해 지역적으로는 최적이지만, 그 선택들을 계속 수집하여 최종적(전역적)인 해답을 만들었다고 해서, 그것이 최적이라는 보장은 없다. 하지만 탐욕알고리즘을 적용할 수 있는 문제들은 지역적으로 최적이면서 전역적으로 최적인 문제들이다.

먼저, 합이 최소가 되려면 3자리 수 + 1자리 수가 아닌 2자리 수 + 2자리 수가 되어야한다.
1. 가장 작은 두 숫자(digits[0], digits[1])가 10의 자리에 와야한다.
2. 나머지 두 숫자(digits[2], digits[3])가 1의 자리에 와야한다.
즉, 10의 자리를 고를 때 그 순간에 최적이라고 생각되는 것을 선택하고 그 다음에 1의 자리를 고를 때 그 순간에 최적이라고 생각되는 것을 선택하는 방식으로 진행되는 것이다.
위와 같이 조합된 두 수를 더할 경우 최솟값이 형성된다.

Others

var minimumSum = function(num) {
    const temp=num.toString().split('').sort();
return (parseInt(temp[0]+temp[2])+parseInt(temp[1]+temp[3]));
    
};

굳이 다시 Number 타입으로 변환할 필요없이 바로 sort 메소드로 정렬이 가능했다...
sort 메소드 사용시 compareFunction이 없어도 한 자리 수를 나타내는 String이기때문에 정렬이 가능하다.

0개의 댓글