Skip to content

Commit 91a5c95

Browse files
committed
updated: product of array except self
1 parent 351bb59 commit 91a5c95

File tree

1 file changed

+112
-12
lines changed

1 file changed

+112
-12
lines changed
Lines changed: 112 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""TC: O(n), SC: O(n)
1+
"""TC: O(n), SC: O(1)
22
33
์•„์ด๋””์–ด:
44
๋‹ค์Œ์˜ ์„ธ ์ƒํ™ฉ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
@@ -12,38 +12,138 @@
1212
๊ทธ๋Ÿฌ๋ฏ€๋กœ, ๋จผ์ € nums์— ์žˆ๋Š” ์ˆซ์ž๋“ค์„ ๋Œ๋ฉด์„œ
1313
- 0์ด ์•„๋‹Œ ์ˆซ์ž๋ฅผ ์ „๋ถ€ ๊ณฑํ•œ ๊ฐ’ p๋ฅผ ๋งŒ๋“ ๋‹ค.
1414
- 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
15+
- 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋‘˜ ์ด์ƒ์ธ์ง€ ์ฒดํฌํ•œ๋‹ค.
1516
1617
๊ทธ ๋‹ค์Œ
17-
- 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค์˜ ๊ธธ์ด๋ฅผ ๋ณด๊ณ  ์œ„์˜ ์„ธ ์ƒํ™ฉ ์ค‘ ํ•˜๋‚˜์— ๋Œ€์‘ํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
18+
- 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋‘˜ ์ด์ƒ์ธ์ง€, 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ๋ณด๊ณ  ์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ด.
1819
1920
SC:
2021
- 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).
2425
2526
TC:
26-
- nums๊ฐ’์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉด์„œ p, zero_ind๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ• ๋•Œ O(n)
27+
- nums๊ฐ’์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉด์„œ p, zero_ind, all_zero๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ• ๋•Œ O(n)
2728
- ๊ฒฐ๊ณผ๋กœ ๋ฆฌํ„ดํ•  ๊ฐ’ ๋งŒ๋“ค๋•Œ O(n)
2829
- ์ข…ํ•ฉํ•˜๋ฉด O(n).
2930
"""
3031

3132

3233
class Solution:
3334
def productExceptSelf(self, nums: List[int]) -> List[int]:
34-
zero_ind = []
35+
all_zero = True
36+
zero_ind = None
3537
p = 1
3638
for i, e in enumerate(nums):
3739
if e == 0:
38-
zero_ind.append(i)
40+
if zero_ind is not None:
41+
break
42+
zero_ind = i
3943
else:
4044
p *= e
41-
45+
else:
46+
all_zero = False
4247
sol = [0] * len(nums)
43-
if len(zero_ind) > 1:
48+
if all_zero:
4449
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
4752
return sol
4853
else:
4954
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

Comments
ย (0)