문제 링크 : https://leetcode.com/problems/multiply-strings/두
두 개의 nums1 과 nums2를 곱하는 문제이다
내장된 함수를 쓰면 안된다는 조건이 있다.
class Solution:
def multiply(self, nums1: str, nums2: str) -> str:
res = [0] * (len(nums1)+len(nums2))
for i in range(len(nums1)-1,-1,-1):
plus = 0
for j in range(len(nums2)-1,-1,-1):
temp = (ord(nums1[i]) - ord('0'))*(ord(nums2[j]) - ord('0')) + plus
plus = (res[i+j+1]+temp)//10
res[i+j+1] = (res[i+j+1]+temp) %10
res[i] += plus
res = ''.join(map(str, res))
return '0' if not res.lstrip('0') else res.lstrip('0')
123 456 을 예로 들어보자.
한자리 수 씩 곱하는 경우 최소 한자리 최대 두자리가 나온다. (최대 : 9 9 = 81)
각 자리수끼리 곱한 수들을 동일한 자리수들끼리 더해주는 경우 정답이 나오는데 이 때 최대 9까지의 carry 값이 각 자리에 더해질 수 있다. 그렇다 하더라도 최대값은 최대 두자리가 나오므로 (최대 : 81 + 9 = 90) n의 자리 수 x m의 자리 수 곱셈의 결과 문자열은 최대 n + m 이다.
만일 num1의 i 번째 자리수와 num2의 j 번째 자리수를 곱한다고 했을 때, 곱한 값은 위 수식으로 알아봤을 때 정답값의 i + j + 1 번째 인덱스를 기준으로 값이 세팅된다.