-
[array] product of array except selfAlgorithm/LeetCode 2025. 2. 8. 17:46
✅ Problem
https://leetcode.com/problems/product-of-array-except-self/
✅ Approach & Solution
방식1) 시간복잡도 : O(n)
더보기- 자기 자신을 제외하고 자신의 왼쪽 곱셈 결과와 오른쪽 곱셈 결과 곱하기
class Solution { public int[] productExceptSelf(int[] nums) { int[] result = new int[nums.length]; // 자기 자신의 왼쪽 곱셈 결과 포함시키기 int p = 1; // 자기 자신은 제외시켜야 하므로 1로 초기화 for (int i = 0; i < nums.length; i++) { result[i] = p; p *= nums[i]; } // 자기 자신의 오른쪽 곱셈 결과 포함시키기 p = 1; // 자기 자신은 제외시켜야 하므로 1로 초기화 for (int i = nums.length - 1; i >= 0; i--) { result[i] *= p; p *= nums[i]; } return result; } }
방식2) 시간복잡도 : O(n)
더보기- 참고) 문제 조건에서 나눗셈 사용하지 말라고 했기 때문에 해당 방식은 정답 X
- 미리 전체 곱셈 값을 구한 후 각 항목별로 자기 자신을 전체 곱셈 값에서 나눔
- 전체 곱셈 값 구하기
- 0이 존재하지 않을 때 : 모든 원소 대상 곱셈 값 계산
- 0이 1개 존재할 때 : 0 제외한 곱셈 값 계산
- 0이 2개 이상 존재할 때 : 곱셈 값 무조건 0
- 항목별 곱셈 값 구하기
- 0이 존재하지 않을 때 : 전체 곱셈 값에서 자기 자신 나누기
- 0이 1개 존재할 때 : 자신이 0일 때만 전체 곱셈 값, 나머지는 모두 0
- 0이 2개 이상 존재할 때 : 무조건 0
- 전체 곱셈 값 구하기
class Solution { public int[] productExceptSelf(int[] nums) { int[] result = new int[nums.length]; int zeroCnt = 0; for (int i : nums) { if (i == 0) { zeroCnt += 1; } } int productResult = 1; if (zeroCnt == 0) { for (int i : nums) { productResult *= i; } } else if (zeroCnt == 1) { for (int i : nums) { if (i != 0) { productResult *= i; } } } else { productResult = 0; } if (zeroCnt == 0) { for (int i = 0; i < nums.length; i++) { result[i] = productResult / nums[i]; } } if (zeroCnt == 1) { for (int i = 0; i < nums.length; i++) { if (nums[i] == 0) { result[i] = productResult; } } } return result; } }
'Algorithm > LeetCode' 카테고리의 다른 글
[array] 3sum (0) 2025.02.01 [array] trapping rain water (0) 2025.01.26 [array] two sum (1) 2025.01.25 [string] longest palindromic substring (0) 2025.01.19 [string] group anagrams (0) 2025.01.18