알고리즘/리트코드
43. Multiply Strings
현진이에오
2022. 9. 12. 21:34
문제를 읽고 생각을 별로 안하고 답을 내면 아래와 같은 답을 제출한다.
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+/, '')
};