Input: nums = [1,2,3,4]
Output: [24,12,8,6]
answer[i]
= nums[i]
에 있는 값을 제외한 nums
에 있는 값을 곱한 값
2*3*4
1*3*4
1*2*4
1*2*3
예제 1처럼 nums
에 있는 모든 값이 0이 아니라면 쉽게 풀 수 있다. nums
에 있는 값을 전부 곱해서 nums[i]
로 나눠주면 된다. 문제는 nums 안에 0이 있을 때이다. 이렇게 풀면 0/nums[i]
를 계산하게 되어서 제대로 된 값을 계산할 수 없다.
하나의 예시를 들어보자. 문제에 나와있는 예제2이다.
Input: nums = [-1,1,0,-3,3]
Output: [0,0,9,0,0]
nums
에 있는 값을 전부 곱하면 0이 된다. i=2
일 때 0/0
이 되어서 에러를 발생시킨다. 분모에는 0이 들어갈 수 없다. 따라서 이때를 예외로 만들어서 계산한다.
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
answer = [0] * len(nums)
allMultiply = reduce(operator.mul, tuple(nums))
for i in range(len(nums)):
if nums[i] != 0:
answer[i] = allMultiply // nums[i]
else:
slicedTuple = tuple(nums[:i]+nums[i+1:])
answer[i] = reduce(operator.mul, slicedTuple)
return answer
sum()처럼 계산할 수 있는 mul()을 찾다가 reduce를 사용하는 방식을 배웠다. slicedTuple
은 nums[i]
를 뺀 tuple이다.