Algorithm/LeetCode
[array] product of array except self
sw_develop
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;
}
}