|
| 1 | +"""TC: O(n^2), SC: O(n^2) |
| 2 | +
|
| 3 | +์์ด๋์ด: |
| 4 | +- ํฉ์ด 0(์ฆ, ๊ณ ์ ๊ฐ)์ด ๋๋ ์ธ ์๋ฅผ ์ฐพ๋ ๊ฒ์ด ๋ฌธ์ . |
| 5 | +- ์ธ ์ ์ค ํ๋๊ฐ ๊ณ ์ ๋์ด ์๋ค๋ฉด, ๊ทธ๋ฆฌ๊ณ ์ซ์๋ค์ด ๋ค์ด์๋ ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋์ด ์๋ค๋ฉด ํฌ ํฌ์ธํฐ ์ฌ์ฉ ๊ฐ๋ฅ. |
| 6 | + - ํฌ ํฌ์ธํฐ ํ
ํฌ๋์ ๊ฒ์ํ๋ฉด ๋ง์ด ๋์ค๋ฏ๋ก ์์ฃผ ์์ธํ ์ค๋ช
์ ์๋ตํ๊ฒ ๋ค. |
| 7 | + - ์ด ๋ฌธ์ ์์๋ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ์์ ๊ฐ๊ณผ ๊ฐ์ฅ ํฐ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๋ ๊ฒ์ด๋ค. |
| 8 | + - ๊ทธ๋ฆฌ๊ณ ์ด ๋ ๊ฐ์ ํฉ์ด |
| 9 | + - ์ํ๋ ๊ฒฐ๊ณผ๋ณด๋ค ์์ผ๋ฉด ์์ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ํฐ ์ชฝ์ผ๋ก ์ฎ๊ธฐ๊ณ , |
| 10 | + - ์ํ๋ ๊ฒฐ๊ณผ๋ณด๋ค ํฌ๋ฉด ํฐ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์์ ์ชฝ์ผ๋ก ์ฎ๊ธด๋ค. |
| 11 | + - ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด์ ์ํ๋ ์์ ์ฐพ๋ ๊ฒ์ด ๊ด๊ฑด. |
| 12 | +- ๊ณ ์ ๋ ์ซ์๋ฅผ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ์์ ๊ฐ๋ถํฐ ํฐ ๊ฐ์ผ๋ก ํ๋์ฉ ์ฎ๊ฒจ๊ฐ๋ฉด ์ค๋ณต ์์ด ํ์์ด ๊ฐ๋ฅํ๋ค. |
| 13 | + - ์ด๋ ํฌ ํฌ์ธํฐ๋ฅผ ์ธ ๊ตฌ๊ฐ์ ๊ณ ์ ๋ ์ซ์ ๋ค์ ์ค๋ ์ซ์๋ค๋ก ๋๋ค. |
| 14 | + - ์ฝ๋๋ฅผ ๋ณด๋ ๊ฒ์ด ์ดํด๊ฐ ๋ ๋น ๋ฅผ ๊ฒ์ด๋ค.. |
| 15 | +
|
| 16 | +SC: |
| 17 | +- ์์ธํ ์ค๋ช
์ TC ๋ถ์์์ ํ์ธ ๊ฐ๋ฅ. |
| 18 | +- ์ข
ํฉํ๋ฉด O(n^2). |
| 19 | +
|
| 20 | +TC: |
| 21 | +- nums๋ฅผ sortํ๋ ๊ณผ์ ์์ O(n * log(n)) |
| 22 | +- ์ ๋ ฌ๋ nums๋ฅผ ๋ชจ๋ ์ํ. |
| 23 | + - ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ํ๋ง๋ค n-1, n-2, ..., 2 ํฌ๊ธฐ์ ๊ตฌ๊ฐ์์ ํฌ ํฌ์ธํฐ ์ฌ์ฉ. |
| 24 | + - ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๋ ๋จ์ ์ฌ์น์ฐ์ฐ ๋ฐ ๋น๊ต์ฐ์ฐ๋ง ์ฌ์ฉํ๋ฏ๋ก O(1). |
| 25 | + - ํฌ ํฌ์ธํฐ ์ฌ์ฉ์ ๋งค ๊ณ์ฐ๋ง๋ค ํฌ์ธํฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ 1์ฉ ์ค์ด๋ ๋ค(s๊ฐ ์ฌ๋ผ๊ฐ๋ e๊ฐ ๋ด๋ ค๊ฐ๋ ). |
| 26 | + - (SC) ๋งค ๊ณ์ฐ๋ง๋ค ์ต๋ ํ ๋ฒ solution์ ์ถ๊ฐํ๋ ์ฐ์ฐ์ ํ๋ค. |
| 27 | + - ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ ์ํ๋ง๋ค C * (n-1), C * (n-2), ..., C * 1์ ์๊ฐ์ด ๋ค์ด๊ฐ. |
| 28 | + - (SC) ๋น์ทํ๊ฒ, ๋งค ์ํ๋ง๋ค ์์ ๊ฐ์ ๊ผด๋ก solution ๊ฐ์๊ฐ ๋ํด์ง ์ ์๋ค. |
| 29 | + - ์ข
ํฉํ๋ฉด O(n^2) |
| 30 | +- ์ด O(n^2) |
| 31 | +""" |
| 32 | + |
| 33 | +from collections import Counter |
| 34 | + |
| 35 | + |
| 36 | +class Solution: |
| 37 | + def threeSum(self, nums: List[int]) -> List[List[int]]: |
| 38 | + # ์ปคํ
. ์ด์ฐจํผ ์ธ ์์ ์ซ์์ ๋ฑ์ฅํ ์ ์๋ ๊ฐ์ ์ซ์ ๊ฐ์๊ฐ ์ต๋ 3๊ฐ์ด๋ฏ๋ก, |
| 39 | + # ์ฒ์ ์ฃผ์ด์ง nums์ ๊ฐ์ ์ซ์๊ฐ ๋ค ๋ฒ ์ด์ ๋ฑ์ฅํ๋ฉด ์ธ ๋ฒ๋ง ๋์ค๋๋ก ๋ฐ๊ฟ์ค๋ค. |
| 40 | + # ์ด ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ๊ฐ์ ์ซ์๊ฐ ๋ง์ด ๋ฐ๋ณต๋๋ ์ผ์ด์ค์์ ์๊ฐ ๊ฐ์ ์ด ์์ ์ ์๋ค. |
| 41 | + # Counter ์ฐ๋ ๋ฐ์ O(n), ์๋ก tmp_nums ๋ฆฌ์คํธ๋ฅผ ๋ง๋๋ ๋ฐ์ O(n)์ ์๊ฐ์ด ๋ค์ด๊ฐ๋ฏ๋ก |
| 42 | + # ์ต์ข
์ ์ธ ์๊ฐ ๋ณต์ก๋์ ์ํฅ์ ์ฃผ์ง๋ ์๋๋ค. |
| 43 | + tmp_nums = [] |
| 44 | + for k, v in Counter(nums).items(): |
| 45 | + tmp_nums += [k] * min(v, 3) |
| 46 | + |
| 47 | + # ์ฌ๊ธฐ๋ถํฐ๊ฐ ์ฃผ๋ ๊ตฌํ. |
| 48 | + sorted_nums = sorted(tmp_nums) # TC: O(n * log(n)) |
| 49 | + nums_len = len(tmp_nums) |
| 50 | + |
| 51 | + sol = set() |
| 52 | + for i in range(nums_len): # TC: O(n) |
| 53 | + if i > 0 and sorted_nums[i] == sorted_nums[i - 1]: |
| 54 | + # ์ปคํ
. ๊ณ ์ ๊ฐ์ด ์ด๋ฏธ ํ ๋ฒ ์ฌ์ฉ๋์๋ ๊ฐ์ด๋ฉด ์คํตํด๋ ๊ด์ฐฎ๋ค. |
| 55 | + continue |
| 56 | + s, e = i + 1, nums_len - 1 |
| 57 | + while s < e: |
| 58 | + # ์ด while๋ฌธ ์ ์ฒด์์ TC O(n). |
| 59 | + v = sorted_nums[s] + sorted_nums[e] |
| 60 | + if v == -sorted_nums[i]: |
| 61 | + # i < s < e ์ด๋ฏ๋ก, ์ด ์์๋๋ก ์ซ์๋ ์ ๋ ฌ๋ ์ํ๋ค. |
| 62 | + # ์ฆ, ๊ฐ์ ๊ฐ์ ์ฌ์ฉํ ์์๋ง ๋ค๋ฅธ ์์ ๊ฑฑ์ ํ์ง ์์๋ ๋๋ค. |
| 63 | + sol.add((sorted_nums[i], sorted_nums[s], sorted_nums[e])) |
| 64 | + if v < -sorted_nums[i]: |
| 65 | + # s, e์ ๋ ๊ฐ์ ๋ํ ๊ฒ์ด ์ํ๋ ๊ฐ๋ณด๋ค ์์ผ๋ฉด, ์์ ์ชฝ์ ์๋ ํฌ์ธํฐ๋ฅผ |
| 66 | + # ๋ ํฐ ์ซ์๊ฐ ์๋ ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ฉด ๋๋ค. |
| 67 | + # ์ฌ๊ธฐ์๋ ์ค๋ณต ๊ฐ ์ปคํ
์ ํ๋ ค๋ฉด ํ ์ ์๊ฒ ์ง๋ง, ์ด ์ปคํ
์ ์ ํ๋ ค๊ณ |
| 68 | + # ๋งจ ์์์ ๊ฐ์ ์ซ์๋ค์ ๋ฏธ๋ฆฌ ์ต๋ํ ์ ๊ฑฐํด๋์๋ค. |
| 69 | + s += 1 |
| 70 | + else: |
| 71 | + # s, e์ ๋ ๊ฐ์ ๋ํ ๊ฒ์ด ์ํ๋ ๊ฐ๋ณด๋ค ํฌ๋ฉด, ํฐ ์ชฝ์ ์๋ ํฌ์ธํฐ๋ฅผ |
| 72 | + # ๋ ์์ ์ซ์๊ฐ ์๋ ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ฉด ๋๋ค. |
| 73 | + # ์ฌ๊ธฐ์๋ ์ค๋ณต ๊ฐ ์ปคํ
์ ํ๋ ค๋ฉด ํ ์ ์๊ฒ ์ง๋ง, ์ด ์ปคํ
์ ์ ํ๋ ค๊ณ |
| 74 | + # ๋งจ ์์์ ๊ฐ์ ์ซ์๋ค์ ๋ฏธ๋ฆฌ ์ต๋ํ ์ ๊ฑฐํด๋์๋ค. |
| 75 | + e -= 1 |
| 76 | + return sol # ํ์
ํํธ๋ฅผ ๋ฐ๋ฅด์ง ์์๋ ์ ์ถ์ ๋๋ค... |
0 commit comments