문제를 읽고 생각을 별로 안하고 답을 내면 아래와 같은 답을 제출한다.
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 |