Skip to content

Commit 73e6832

Browse files
committed
solve: product of array except self
1 parent cc2b8a3 commit 73e6832

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class Solution {
2+
// time: O(n), space: O(n)
3+
func productExceptSelf(_ nums: [Int]) -> [Int] {
4+
var resultFromFirst = [1]
5+
var resultFromLast = [1]
6+
// 기준 원소의 왼쪽 곱은 resultFromFirst에 저장
7+
// 기준 원소의 오른쪽 곱은 resultFromLast에 저장
8+
for i in 1..<nums.count {
9+
resultFromFirst.append(resultFromFirst[i-1] * nums[i-1])
10+
resultFromLast.append(resultFromLast[i-1] * nums[nums.count - i])
11+
}
12+
// 결과 반환시 순서를 생각해서
13+
//resultFromFirst는 첫번째 원소부터 마지막 원소까지, resultFromLast는 마지막 원소 부터 첫번째 원소까지, 서로를 곱해준다.
14+
return (0..<nums.count).map { resultFromFirst[$0] * resultFromLast[nums.count - $0 - 1] }
15+
}
16+
}
17+
//Input: nums = [1,2,3,4]
18+
//Output: [24,12,8,6]
19+
/*
20+
2*3*4, 3*4, 4, 1 오른쪽 부분 곱
21+
1, 1, 1*2, 1*2*3 왼쪽 부분 곱
22+
*/
23+
24+
// 공간 복잡도를 O(1)로도 해결이 가능하다! (결과배열 제외)
25+
// 아이디어를 생각해보자.
26+
/*
27+
1. 결과 배열을 하나 만든다.
28+
2. nums의 원소들을 사용해 왼쪽부분 곱을 먼저 결과배열에 저장한다.
29+
3. 오른쪽 부분 곱을 차례대로 계산에 결과배열 원소에 곱연산해 저장한다.
30+
4. 반환!
31+
*/
32+
class Solution {
33+
func productExceptSelf(_ nums: [Int]) -> [Int] {
34+
var result = Array(repeating: 1, count: nums.count)
35+
for i in 1..<nums.count {
36+
// 원래 하던대로 왼쪽 부분 곱으로 초기화
37+
result[i] = result[i-1] * nums[i-1]
38+
}
39+
40+
var temp = 1 // 오른쪽 곱 값을 저장해 둘 변수
41+
for i in 1...nums.count {
42+
// 결과 배열의 마지막 부터 self 의 오른쪽 부분 곱 시작
43+
result[nums.count - i] *= temp
44+
// 연산 후 temp에 nums의 오른쪽 원소 하나씩 곱하기
45+
temp *= nums[nums.count - i]
46+
}
47+
48+
return result
49+
}
50+
}

0 commit comments

Comments
 (0)