|
| 1 | +#이 문제는 배열의 각 요소 i를 제외한 나머지 요소들의 곱을 구하는 문제임 |
| 2 | +#1)각 요소 i를 기준으로 왼쪽 숫자들의 곱과 오른쪽 숫자들의 곱을 따로 계산, 2)최종 결과는 왼쪽 곱과 오른쪽 곱의 곱 |
| 3 | + |
| 4 | +class Solution: |
| 5 | + def productExceptSelf(self, nums: List[int]): |
| 6 | + #입력 배열의 길이를 저장 |
| 7 | + ##Example 1의 경우 : len(nums) = 4 |
| 8 | + n = len(nums) |
| 9 | + #결과를 저장할 배열을 곱셈의 항등원인 1로 모두 초기화 |
| 10 | + #cf. 빈 집합의 곱은 1, 합은 0으로 정의됨 |
| 11 | + ##answer = [1] * 4 = [1, 1, 1, 1] |
| 12 | + answer = [1] * n |
| 13 | + |
| 14 | + #i를 기준으로 왼쪽 숫자들의 곱을 계산 |
| 15 | + #왼쪽 곱의 초기값 |
| 16 | + left_product = 1 |
| 17 | + for i in range(n): |
| 18 | + #현재 위치의 왼쪽 곱을 저장 |
| 19 | + ##nums[0]의 왼쪽에는 아무 숫자도 없으므로, |
| 20 | + ##아무것도 없는 상태의 곱은 1임. 따라서 answer[0]=1 |
| 21 | + ##answer[1]=1 / answer[2]=2 / answer[3]=6 |
| 22 | + answer[i] = left_product |
| 23 | + #다음 위치를 위해 현재 수를 곱함 |
| 24 | + ##left_product = 1 * 1 = 1 / left_product = 1 * 2 = 2 |
| 25 | + ##left_product = 2 * 3 = 6 / left_product = 6 * 4 = 24 |
| 26 | + left_product *= nums[i] |
| 27 | + |
| 28 | + ##첫 번째 for문 후 answer = [1, 1, 2, 6] |
| 29 | + #i를 기준으로 오른쪽 숫자들의 곱 계산 및 최종 결과 생성 |
| 30 | + right_product = 1 |
| 31 | + #오른쪽에서 왼쪽으로 순회 |
| 32 | + for i in range(n-1, -1, -1): |
| 33 | + #현재 위치의 오른쪽 곱을 저장 |
| 34 | + ##answer[3] = 6 * 1 = 6 / answer[2] = 2 * 1 = 2 |
| 35 | + ##answer[1] = 1 * 1 = 1 / answer[1] = 1 * 1 = 1 |
| 36 | + answer[i] *= right_product |
| 37 | + #다음 위치를 위해 현재 수를 곱함 |
| 38 | + ##right_product = 1 * 4 = 4 / right_product = 4 * 3 = 12 |
| 39 | + ##right_product = 12 * 2 = 24 / right_product = 24 * 1 = 24 |
| 40 | + right_product *= nums[i] |
| 41 | + |
| 42 | + |
| 43 | + #최종 결과를 반환 |
| 44 | + ##최종 answer = [24, 12, 8, 6] |
| 45 | + return answer |
| 46 | + |
| 47 | + #시간 복잡도: O(n) |
| 48 | + ##두 번의 선형 순회만 수행하며, 각 순회는 O(n) 시간이 소요 |
| 49 | + #공간 복잡도: O(1) |
| 50 | + ##추가적인 공간을 사용하지 않음 |
| 51 | + ##단, 출력 배열은 문제의 요구사항이므로 제외 |
| 52 | + |
| 53 | + |
| 54 | + |
| 55 | + |
0 commit comments