Skip to content

Commit 4de2e19

Browse files
committed
week2: product-of-array-except-self
1 parent d294553 commit 4de2e19

1 file changed

Lines changed: 66 additions & 0 deletions

File tree

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// brute force 방식으로 풀이 - O(n^2)
2+
const productExceptSelf = (nums) => {
3+
const answer = [];
4+
for (let i = 0; i < nums.length; i++) {
5+
let product = 1;
6+
for (let j = 0; j < nums.length; j++) {
7+
if (i !== j) {
8+
product *= nums[j];
9+
}
10+
}
11+
answer.push(product);
12+
}
13+
return answer;
14+
};
15+
16+
// Prefix-Suffix Array - 시간 O(n) / 공간 O(n)
17+
const productExceptSelf2 = (nums) => {
18+
const n = nums.length;
19+
20+
// 1. 세 배열을 만든다
21+
const prefix = new Array(n).fill(1);
22+
const suffix = new Array(n).fill(1);
23+
const answer = new Array(n).fill(1);
24+
25+
// 2. prefix 채우기: 왼쪽 누적곱
26+
// i=0은 왼쪽이 없으므로 그대로 1
27+
// i=1부터 시작
28+
for (let i = 1; i < n; i++) {
29+
prefix[i] = prefix[i - 1] * nums[i - 1];
30+
}
31+
32+
// 3. suffix 채우기: 오른쪽 누적곱
33+
// i=n-1은 오른쪽이 없으므로 그대로 1
34+
// i=n-2부터 시작
35+
for (let i = n - 2; i >= 0; i--) {
36+
suffix[i] = suffix[i + 1] * nums[i + 1];
37+
}
38+
39+
// 4. prefix * suffix
40+
for (let i = 0; i < n; i++) {
41+
answer[i] = prefix[i] * suffix[i];
42+
}
43+
44+
return answer;
45+
};
46+
47+
// Two-Pass Optimized - 시간 O(n) / 공간 O(1)
48+
const productExceptSelf3 = (nums) => {
49+
const products = new Array(nums.length).fill(1);
50+
51+
// 1. before로 왼쪽 누적곱을 products[i+1]에 누적
52+
let before = 1;
53+
for (let i = 0; i < nums.length - 1; i++) {
54+
before *= nums[i];
55+
products[i + 1] *= before;
56+
}
57+
58+
// 2. after로 오른쪽 누적곱을 products[i-1]에 누적
59+
let after = 1;
60+
for (let i = nums.length - 1; i > 0; i--) {
61+
after *= nums[i];
62+
products[i - 1] *= after;
63+
}
64+
65+
return products;
66+
};

0 commit comments

Comments
 (0)