|
| 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