본문 바로가기

코딩/leetcode

[leetcode]238 자신을 제외한 배열의 곱

문제 : 배열을 입력 받아 output[i]가 자신을 제외한 나머지 모든 요소의 곱셈 결과가 되도록 출력하라

 

입력 :[1,2,3,4]

 

출력 : [24,12,8,60]

 

문제를 푸는 과정

 

1. 리스트의 모든 곱을 구한다.

2. 나로 나누어준다.

3. 나로 나누는 과정에서 중요한 점 -> 0으로 나눌 수 없음

 

 

따라서 가장 중요한 것은 리스트에 0이 있느냐 없느냐

 

1. 리스트에 0이 있는 경우

  • 리스트에 0만 존재하는 경우
  • 리스트에 0과 다른 숫자가 함께 존재하는 경우
    • 리스트에 0이 1개만 존재하는 경우 -> 나를 제외한 곱이기 때문에 0에서는 곱셈 결과가 나올 수 있다.  
    • 리스트에 0이 2개 이상 존재하는 경우 -> 0을 하나 제외하더라도 곱셈이기 때문에 다른 0이 있어서 결과에서 언제나 0이 나옴

2. 리스트에 0이 없는 경우

  • 전체 곱에서 나로 나누어 주면 된다. 

 

내가 푼 코드 

 

class Solution(object):
    def productExceptSelf(self, nums):
        arr = []  # 중복값이 있는지 확인하기 위해서 -> 0만 존재하는지 확인하기 위한 절차.
        result = []  # return값
        k = 1  # 곱셈 결과
        count = 0  # 0의 개수

        # 중복 제거
        for num in nums:
            if num not in arr:
                arr.append(num)

        # 0의 개수 세기
        for num in nums:
            if num == 0:
                count += 1

        # 0이 있는 경우의 nums의 모든 요소의 곱셈 결과 구하기.
        # 1. 0만 존재하는 경우
        if count > 2:
            k = 0
        # 0만 존재하는 경우가 아닌 경우
        else:
            # 0이 존재하는 경우
            if 0 in nums:
                for i in range(len(nums)):
                    if nums[i] == 0:
                        continue
                    else:
                        k *= nums[i]
            # 0이 존재하지 않는 경우
            else:
                for i in range(len(nums)):
                    k *= nums[i]

        # 1. 0만 존재하는 경우
        arr =[]
        for value in nums:
          if value not in arr:
            arr.append(value)

        if count >= 2:
            for i in range(len(nums)):
                result.append(0)
        # 0만 존재하는 경우가 아닌 경우
        elif len(arr) ==1 and arr[0]==0:
          for i in range(len(nums)):
            result.append(0)
        else:
            # 0이 존재하는 경우
            if 0 in nums:
                for i in range(len(nums)):
                    if nums[i] == 0:
                        result.append(k)
                    else:
                        result.append(0)
            # 0이 존재하지 않는 경우
            else:
                for i in range(len(nums)):
                    result.append(int(k / nums[i]))

        return result

 

코드 분석

 

for num in nums:
            if num == 0:
                count += 1

 

리스트에 0의 숫자를 카운

 

 

if count > 2:
            k = 0
        # 0만 존재하는 경우가 아닌 경우
        else:
            # 0이 존재하는 경우
            if 0 in nums:
                for i in range(len(nums)):
                    if nums[i] == 0:
                        continue
                    else:
                        k *= nums[i]
            # 0이 존재하지 않는 경우
            else:
                for i in range(len(nums)):
                    k *= nums[i]

 

arr =[]
        for value in nums:
          if value not in arr:
            arr.append(value)

        if count >= 2:
            for i in range(len(nums)):
                result.append(0)
        # 0만 존재하는 경우가 아닌 경우
        elif len(arr) ==1 and arr[0]==0:
          for i in range(len(nums)):
            result.append(0)

리스트에 중복을 제거해주어 리스트에 있는 것이 1개인데 그게 0인 경우, 즉 리스트 안에 있는 숫자가 0만 있는 경우와 0이 두번 있는 경우를 분리함.

else:
                for i in range(len(nums)):
                    result.append(int(k / nums[i]))

        return result