Cute Running Puppy

algorithm/[python] leetcode

[python] 238. Product of Array Except Self

R.silver 2022. 9. 6. 23:36
반응형

Product of Array Except Self - LeetCode

 

Product of Array Except Self - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

자신을 제외한 배열의 곱 

 

제시된 배열에서 자신을 제외한 값들을 곱한 값들을 리턴하는 문제 

 

주의!! 나눗셈 금지 조건 존재 

배열의 모든 값들의 곱을 구하고 자기 자신으로 나누는 풀이는 불가! 

 

풀이

 

옳은 풀이 

 

자기 자신을 제외한

왼쪽 값들의 곱셈 결과와 

오른쪽 값들의 곱을 곱하면 올바른 풀이를 할 수 있다. 

 

1. 자기 자신을 제외한 왼쪽 값들의 곱 

 

mul = 1 # 곱셈이기에 초깃값이 1이 되어야 한다 
for i in range(len(nums)):
	result.appand(mul) # 자신을 제외한 왼쪽 값들의 곱들이 들어간다 
    mul *= nums[i] # 여기서 이전 값들의 곱이 쌓인다

 

2. 자기 자신을 제외한 오른쪽 값들의 곱 

 

mul = 1
for i in range(len(nums)-1, 0 -1, -1):
	# (start, stop, step) stop은 범위 미포함이라 -1 해줘야 한다 
    result[i] *= mul # 왼쪽에서 곱해져온 값에 또 곱해야 한다 
    mul *= nums[i]

 

3. 완성된 코드 

 

from typing import List
class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        result = []
        mul = 1
        for i in range(len(nums)):
            result.append(mul)
            mul *= nums[i]
        mul = 1

        for i in range(len(nums)-1, 0 -1, -1):
            result[i] *= mul
            mul *= nums[i]
                    return result

s = Solution()
print(s.productExceptSelf([1,2,3,4]))
print(s.productExceptSelf([-1,1,0,-3,3]))
print(s.productExceptSelf([0, 0]))
print(s.productExceptSelf([0, 4, 0]))

 

옳지 않은 풀이

 

모든 값들을 곱하여 자기 자신으로 나누려고 시도 (조건에 맞지 않음)

 

from typing import List
class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        mul = 1
        for num in nums:
            if nums.count(0) > 1:
                mul = 0
            if num != 0:
                mul *= num
            # 전부 0만 들어있는 배열이 들어왔을 때 오류 
            # -> set 으로 처리
            # set(nums) == {0}

            # 0이 2개 이상 들어있는 배열은 ?
            # 항상 값이 0이 된다 
            # if nums.count(0) > 1: 로 위의 질문과 한번에 처리
        for num in nums:
            if 0 in nums:
                if num != 0:
                    result.append(0)
                else:
                    result.append(mul)
            else:
                result.append(mul//num)
        return result

 

위 코드가 타임 아웃이 되었다 

(타임 아웃도 문제인데 조건이 아예 맞지 않은 풀이)

 

타임 아웃이 되어 자기 자신을 제외한 배열을 인덱싱을 사용하여 만들었다 

from typing import List
class Solution:
	def productExceptSelf(self, nums: List[int]) -> List[int]:
        result = []
        for i in range(len(nums)):
            new_nums = nums[:i] + nums[i+1:]
            mul = 1
            for num in new_nums:
                mul *= num
            result.append(mul)
        return result

 

 

반응형

'algorithm > [python] leetcode' 카테고리의 다른 글

[python] 561. Array Partition  (0) 2022.09.05
[python] 15. 3sum  (0) 2022.08.02
[python] 1. Two Sum  (0) 2022.07.24
[python]5. Longest Palindromic Substring  (0) 2022.07.24
[python] 937. Reorder Data in Log Files  (0) 2022.03.26