본문 바로가기

알고리즘/리트코드

43. Multiply Strings

문제를 읽고 생각을 별로 안하고 답을 내면 아래와 같은 답을 제출한다.

 

const multiply = function(num1, num2) {
    return String(parseInt(num1) * parseInt(num2))
};

 

이렇게 내면 무조건 틀리는데 이유는 정말 큰 수를 곱하면 overflow가 나기 때문이다.

따라서 배열에 저장하면서 "잘" 곱해줘야한다.

 

잘 곱해준다는 의미는 아래와 같이 배열에 저장하면서 곱하는 것을 의미한다.

 

const multiply = function(num1, num2) {
    if (num1 === "0" || num2 === "0") return "0" // 0이면 무조건 0리턴
    
    const n = num1.length, m = num2.length // 배열 길이 저장
    const ans = Array(m + n).fill(0) // 두개 곱해도 두수길이 더한 배열의 길이 밖에 못채움

    let currIdx = ans.length - 1 // 곱하기 한단계 할 때마다 감소하는 포인터
    
    for (let i = n - 1; i >= 0; i--) {
        let idx = currIdx--; // 기준
        for (let j = m - 1; j >= 0; j--) {
            const res = +num1[i] * +num2[j] + ans[idx] // 계산
            ans[idx] = res % 10 // 나머지는 현재 idx
            ans[--idx] += Math.floor(res / 10) // 몫은 전 인덱스에 저장
        }
    }
    return ans.join('').replace(/^0+/, '')
};

'알고리즘 > 리트코드' 카테고리의 다른 글

LeetCode 93. Restore IP Addresses  (0) 2023.01.21
Leetcode 45. Jump Game II  (0) 2023.01.05
139. Word Break  (0) 2022.05.08
54. Spiral Matrix  (0) 2022.04.30
22. Generate Parentheses  (0) 2022.04.16