|
1 |
| -"""TC: O(n), SC: O(n) |
| 1 | +"""TC: O(n), SC: O(1) |
2 | 2 |
|
3 | 3 | ์์ด๋์ด:
|
4 | 4 | ๋ค์์ ์ธ ์ํฉ ์ค ํ๋๊ฐ ๋ ๊ฒ์ด๋ค.
|
|
12 | 12 | ๊ทธ๋ฌ๋ฏ๋ก, ๋จผ์ nums์ ์๋ ์ซ์๋ค์ ๋๋ฉด์
|
13 | 13 | - 0์ด ์๋ ์ซ์๋ฅผ ์ ๋ถ ๊ณฑํ ๊ฐ p๋ฅผ ๋ง๋ ๋ค.
|
14 | 14 | - 0์ด ๋ค์ด์๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋๋ค.
|
| 15 | +- 0์ด ๋ค์ด์๋ ์ธ๋ฑ์ค๊ฐ ๋ ์ด์์ธ์ง ์ฒดํฌํ๋ค. |
15 | 16 |
|
16 | 17 | ๊ทธ ๋ค์
|
17 |
| -- 0์ด ๋ค์ด์๋ ์ธ๋ฑ์ค์ ๊ธธ์ด๋ฅผ ๋ณด๊ณ ์์ ์ธ ์ํฉ ์ค ํ๋์ ๋์ํด์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํ๋ค. |
| 18 | +- 0์ด ๋ค์ด์๋ ์ธ๋ฑ์ค๊ฐ ๋ ์ด์์ธ์ง, 0์ด ๋ค์ด์๋ ์ธ๋ฑ์ค๊ฐ ์๋์ง ๋ณด๊ณ ์ํฉ์ ๋ง๊ฒ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํด. |
18 | 19 |
|
19 | 20 | SC:
|
20 | 21 | - 0์ด ์๋ ์ซ์๋ค์ ๊ณฑํ ๊ฐ p๋ฅผ ๊ด๋ฆฌํ ๋ O(1)
|
21 |
| -- 0์ด ๋ฑ์ฅํ๋ ์ธ๋ฑ์ค zero_ind๋ฅผ ๊ด๋ฆฌํ ๋ O(n) |
22 |
| -- ๊ฒฐ๊ณผ๋ก ๋ฆฌํดํ ๊ฐ O(n) |
23 |
| -- ์ข
ํฉํ๋ฉด O(n). |
| 22 | +- 0์ด ๋ฑ์ฅํ๋ ์ธ๋ฑ์ค zero_ind์ ๋ ์ด์ ์๋์ง ์ฌ๋ถ all_zero ํ๋๊ทธ๋ฅผ ๊ด๋ฆฌํ ๋ O(1). |
| 23 | +- ๊ฒฐ๊ณผ๋ก ๋ฆฌํดํ ๊ฐ O(n) <- ์ด๊ฑด ๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์์์ ์ ์ธํ๋ค. |
| 24 | +- ์ข
ํฉํ๋ฉด O(1). |
24 | 25 |
|
25 | 26 | TC:
|
26 |
| -- nums๊ฐ์ ํ ๋ฒ ์ํํ๋ฉด์ p, zero_ind๊ฐ์ ์
๋ฐ์ดํธ ํ ๋ O(n) |
| 27 | +- nums๊ฐ์ ํ ๋ฒ ์ํํ๋ฉด์ p, zero_ind, all_zero๊ฐ์ ์
๋ฐ์ดํธ ํ ๋ O(n) |
27 | 28 | - ๊ฒฐ๊ณผ๋ก ๋ฆฌํดํ ๊ฐ ๋ง๋ค๋ O(n)
|
28 | 29 | - ์ข
ํฉํ๋ฉด O(n).
|
29 | 30 | """
|
30 | 31 |
|
31 | 32 |
|
32 | 33 | class Solution:
|
33 | 34 | def productExceptSelf(self, nums: List[int]) -> List[int]:
|
34 |
| - zero_ind = [] |
| 35 | + all_zero = True |
| 36 | + zero_ind = None |
35 | 37 | p = 1
|
36 | 38 | for i, e in enumerate(nums):
|
37 | 39 | if e == 0:
|
38 |
| - zero_ind.append(i) |
| 40 | + if zero_ind is not None: |
| 41 | + break |
| 42 | + zero_ind = i |
39 | 43 | else:
|
40 | 44 | p *= e
|
41 |
| - |
| 45 | + else: |
| 46 | + all_zero = False |
42 | 47 | sol = [0] * len(nums)
|
43 |
| - if len(zero_ind) > 1: |
| 48 | + if all_zero: |
44 | 49 | return sol
|
45 |
| - elif len(zero_ind) == 1: |
46 |
| - sol[zero_ind[0]] = p |
| 50 | + elif zero_ind is not None: |
| 51 | + sol[zero_ind] = p |
47 | 52 | return sol
|
48 | 53 | else:
|
49 | 54 | return [p // i for i in nums]
|
| 55 | + |
| 56 | + |
| 57 | +""" TC: O(n), SC: O(1) |
| 58 | +ํ์ง๋ง ์ ์๋ฃจ์
์ ๋ฌธ์ ์์ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ํ `/`(์ ํํ๋ `//`)๋ฅผ ์ผ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. |
| 59 | +๋๋๊ธฐ๋ฅผ ํ์ง ๋ง๋ผ๊ณ ํ์ผ๋ ์ด๋ฅผ ์ด๋ป๊ฒ ์ ์ฐํํด๋ณด์. |
| 60 | +
|
| 61 | +โป ์ฃผ์: ์ ๋ฐํ ๊ณ์ฐ์ ์ทจ์ฝํ ์ ๊ทผ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ๊ตฌํํ ๊ฒ์ด ์ ์๋ํ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ |
| 62 | + ์ ๋ง ์์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ์๋๋ค. |
| 63 | +
|
| 64 | +์์ด๋์ด: |
| 65 | +๋ค์์ ๋ฑ์์ ๋ณด์. |
| 66 | +
|
| 67 | +x / y = 2^(log2(x)) / 2^(log2(y)) = 2^(log2(x)-log2(y)) |
| 68 | +
|
| 69 | +์ฆ, ์ฐ๋ฆฌ๋ ๋๋๊ธฐ ์ฐ์ฐ์ power, log, - ์ฐ์ฐ์ผ๋ก ์ฐํ ๊ฐ๋ฅํ๋ค. |
| 70 | +
|
| 71 | +์์ ์ฐํ ๋ฐฉ๋ฒ์ ํ์ฉํ๊ธฐ ์ํด ๊ธฐ์กด์ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ๋ค. |
| 72 | +- ์๋๋ p๋ฅผ 1๋ก ์ด๊ธฐํํ ๋ค์ nums์ ์๋ ๊ฐ๋ค ์ค 0์ด ์๋ ๊ฒ๋ค์ ์ ๋ถ ๊ณฑํด์คฌ๋ค. |
| 73 | +- ์ด์ p์๋ 2^p์ ๊ณ์ฐํ์๋ ๊ณฑ์
์ ๊ฒฐ๊ณผ๊ฐ์ด ๋์ค๋ ๊ฐ์ ์ ์ฅํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก, |
| 74 | + p๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๊ณ p์๋ nums์ ์๋ ๊ฐ๋ค ์ค 0์ด ์๋ ๊ฐ์ log๋ฅผ ์ทจํ ๊ฐ์ ๋ํด์ค๋ค. |
| 75 | +
|
| 76 | +ํ์ง๋ง 0์ดํ์ ์ค์ x์ ๋ํด์๋ log(x)๊ฐ ์ ์๋์ง ์๋ ๋ฌธ์ ๊ฐ ์๋ค. |
| 77 | +๊ทธ๋ฌ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ ์กฐ์น๋ฅผ ์ทจํด์ผ ํ๋ค. |
| 78 | +- nums์ ์๋ ๊ฐ x๊ฐ 0์ด๋ฉด ๊ทธ๋ฅ ๋์ด๊ฐ๋ค. ์ด๋ ๊ธฐ์กด์ ์ ๊ทผ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ๋ค. |
| 79 | +- nums์ ์๋ ๊ฐ x๊ฐ 0๋ณด๋ค ์์ผ๋ฉด ์ ๋๊ฐ์ ์ทจํ๊ณ ๋ก๊ทธ๋ฅผ ์์ด๋ค. |
| 80 | + ์ฆ, log(|x|)๋ฅผ ๊ณ์ฐํ๋ค. |
| 81 | +- ์ด ๊ฒฝ์ฐ ๊ฒฐ๊ณผ์๋ -1๋ ๊ณฑํด์ค์ผ ํ๋ค๋ ์ฌ์ค์ ์์์ผ ํ๋ฏ๋ก ์ด ์ ๋ณด๋ฅผ |
| 82 | + `is_neg`๋ผ๋ ๋ณ์๋ก ๊ด๋ฆฌํ์. |
| 83 | +
|
| 84 | +์ฃผ์์ : |
| 85 | +์ค๋ช
์ ๋ฑ์ฅํ๋ ๊ธฐํธ์ ์๋์ ์ฝ๋์ ๋ฑ์ฅํ๋ ๊ธฐํธ๋ฅผ ํท๊ฐ๋ฆฌ๋ฉด ์๋๋ค. |
| 86 | +- ์์์๋ power๋ฅผ `^`๊ธฐํธ๋ก ์ผ์ง๋ง python์์๋ `**`๊ธฐํธ๋ฅผ ์ด๋ค. |
| 87 | +- ๊ทธ๋ฆฌ๊ณ python์์ `^`๊ธฐํธ๋ xor์ ์๋ฏธํ๋ค. |
| 88 | +
|
| 89 | +๋ฌธ์ ์ : |
| 90 | +- ์์ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ด๋ก ์ ์ผ๋ก๋ ๋ฌธ์ ๋ ๊ฒ์ด ์์ง๋ง ์ํ๊น๊ฒ๋ ์ปดํจํฐ๋ฅผ ํตํ ์ฐ์ฐ์์๋ |
| 91 | + log๋ฅผ ๊ณ์ฐํ ๊ฐ์ ์์์ ๋ท ์๋ฆฌ์๋ค์ด ์๋ ค๋๊ฐ๋ค. |
| 92 | +- ์ด๋ก ์ธํด 2^p๋ฅผ ๊ณ์ฐํ ๊ฒฐ๊ณผ๊ฐ์ด ๊น๋ํ ์ ์๊ฐ ์๋๋ผ ๋๋ฌ์ด ์์๊ฐ ๋์จ๋ค. ๊ทธ๋์ |
| 93 | + ์ด ์ซ์๊ฐ ์ ๋ต์ ๊ทผ์ ํ ๊ฐ์ผ ๊ฒ์ด๋ผ๊ณ ๊ตณ๊ฒ ๋ฏฟ๊ณ ์ฌ๊ธฐ์ `round` ํจ์๋ฅผ ์จ์ ๋ฐ์ฌ๋ฆผ์ |
| 94 | + ํด์ผ ์ํ๋ ๋ต์ด ๋์จ๋ค. |
| 95 | +- ๊ทธ๋ฐ๋ฐ ์๊ฐํด๋ณด๋ฉด nums์ ๋ค์ด์๋ ๊ฐ๋ค์ ๋ก๊ทธ๋ฅผ ์ทจํ๊ณ ๋ํ๋ ๊ณผ์ ์์ ์ด ์๋ฆฐ ์์์ |
| 96 | + ๊ฐ๋ค์ด ์ ์ ๋์ ๋๋ฉด์ ์ค์ฐจ๊ฐ ์ ์ ์ปค์ง ๊ฒ์ด๋ค. ์ค์ฐจ๊ฐ ์ถฉ๋ถํ ์ปค์ง๋ฉด 2^p๋ฅผ ๊ณ์ฐํ ๊ฐ์ |
| 97 | + ๋ฐ์ฌ๋ฆผ ํ๋๋ผ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ ํํ ๋ต์ด ๋์ค์ง ์๊ฒ ๋ ๊ฒ์ด๋ค. |
| 98 | + - e.g.) nums = range(2, 18) ์ผ๋ |
| 99 | + - expected answer: [177843714048000, 118562476032000, 88921857024000, 71137485619200, ...] |
| 100 | + - result: [177843714047999, 118562476031999, 88921857023999, 71137485619200, ...] |
| 101 | + - diff: [-1, -1, -1, 0, ...] |
| 102 | +- ๊ณฑํ๋ ์์ ํฐ ์๊ฐ ์์ฌ๋ ๋ฌธ์ ๊ฐ ์ฝ๊ฒ ๋ฐ์ํ๋ค. |
| 103 | + - e.g.) nums = [2, 10, 44444444444444] ์ผ๋ |
| 104 | + - expected answer: [444444444444440, 88888888888888, 20] |
| 105 | + - result: [444444444444441, 88888888888888, 20] |
| 106 | + - diff: [1, 0, 0] |
| 107 | +- ๊ทธ๋ ๋ค๋ฉด ์ผ๋ง๋ ๋ง์ ์ซ์๋ฅผ ๊ณฑํ๊ฑฐ๋ ํฐ ์ซ์๋ฅผ ๊ณฑํ๋ ์ํฉ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๊ฐ? |
| 108 | + ๋ฌธ์ ์ ์ฃผ์ด์ง ์กฐ๊ฑด ๋ฒ์ ๋ด์์ ์์ ๋ฐฉ๋ฒ์ด ์ ์๋ํ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ด ๋ณด์ฅ๋๋๊ฐ? |
| 109 | + ์ด์ ๋ํด ์๊ฐํ๋ ๊ฒ์ ๋งค์ฐ ๊ท์ฐฎ์ ์ผ์ด๋ค... |
| 110 | +
|
| 111 | +๊ทธ๋ฐ๋ฐ |
| 112 | +- ๋์ถฉ ๊ด์ฐฐ์ ํด๋ณด๋ ์ซ์๋ค์ ๊ณฑ์ด ๋ฌธ์ ์์ ์ฃผ์ด์ง ์กฐ๊ฑด์ธ `The product ... fit in a 32-bit integer.` |
| 113 | + ๋ณด๋ค ํจ์ฌ ํฐ ๊ฒฝ์ฐ์๋ง ์์ ์ค์ฐจ๊ฐ ์น๋ช
์ ์ธ ์ํฅ์ ์ค๋ค. |
| 114 | +- ๊ทธ๋์ ์ผ๋จ ๋ฆฌํธ์ฝ๋์ ํ์ด๋ฅผ ๋์ ธ๋ณด์๋๋ accept ๋์๋ค. ๋๋ leetcodeํผ์
์ ํ์๋ค๊ณ |
| 115 | + ๋ณผ ์ ์๋ ๊ฒ์ด๋ค. |
| 116 | +- ๋ง์ฝ ์ด ํ์ด๊ฐ ์๋ชป๋์๋ค๊ณ ๋งํ๊ณ ์ถ๋ค๋ฉด ๋ ๋ง๊ณ ๋ฌธ์ ์กฐ๊ฑด์ ์ค๊ณํ ์ฌ๋๊ณผ ํ
์ผ๋ฅผ ๋ง๋ |
| 117 | + ์ฌ๋๋ค์๊ฒ ๋์ ๋์ ธ๋ผ ยฏ\_(ใ)_/ยฏ |
| 118 | +""" |
| 119 | + |
| 120 | +import math |
| 121 | + |
| 122 | + |
| 123 | +class Solution: |
| 124 | + def productExceptSelf(self, nums: List[int]) -> List[int]: |
| 125 | + all_zero = True |
| 126 | + zero_ind = None |
| 127 | + p, is_neg = 0, False |
| 128 | + for i, e in enumerate(nums): |
| 129 | + if e == 0: |
| 130 | + if zero_ind is not None: |
| 131 | + break |
| 132 | + zero_ind = i |
| 133 | + else: |
| 134 | + is_neg ^= e < 0 |
| 135 | + p += math.log2(abs(e)) |
| 136 | + else: |
| 137 | + all_zero = False |
| 138 | + |
| 139 | + sol = [0] * len(nums) |
| 140 | + if all_zero: |
| 141 | + return sol |
| 142 | + elif zero_ind is not None: |
| 143 | + sol[zero_ind] = round(2**p * (-1) ** (is_neg)) |
| 144 | + return sol |
| 145 | + else: |
| 146 | + return [ |
| 147 | + round(2 ** (p - math.log2(abs(i))) * (-1) ** (is_neg ^ (i < 0))) |
| 148 | + for i in nums |
| 149 | + ] |
0 commit comments