문제 : 배열을 입력 받아 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
'코딩 > leetcode' 카테고리의 다른 글
[leetcode]206 연결리스트 뒤집기 (1) | 2023.07.16 |
---|---|
[leetcode]21 두 연결리스트의 병합 (0) | 2023.07.16 |
[leetcode]234 팰린드롬 연결리스 (0) | 2023.07.16 |
leetcode 42 , 빗물 트래킹 (0) | 2023.07.11 |
[leetcode 104] 이진 트리의 최대 깊이 (0) | 2022.10.10 |