Skip to content

Commit

Permalink
Merge pull request #506 from haklee/main
Browse files Browse the repository at this point in the history
[haklee] week 8
  • Loading branch information
haklee authored Oct 5, 2024
2 parents 8fdb7bc + e55cc8c commit ad69c40
Show file tree
Hide file tree
Showing 5 changed files with 377 additions and 0 deletions.
79 changes: 79 additions & 0 deletions clone-graph/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
"""TC: O(n + e), SC: -
๋…ธ๋“œ ๊ฐœ์ˆ˜ n๊ฐœ, ์—ฃ์ง€ ๊ฐœ์ˆ˜ e๊ฐœ
์•„์ด๋””์–ด:
๋ฌธ์ œ ์„ค๋ช…๋ถ€ํ„ฐ๊ฐ€ deepcopy๋ฅผ ํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ˆ ๋‚ด์žฅํ•จ์ˆ˜๋ฅผ ์จ์„œ deepcopy๋ฅผ ํ•ด์ฃผ์ž.
SC:
- ๋‚ด์žฅํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ๊ณต๊ฐ„๋“ค์„ ๋”ฐ๋กœ ์ž˜ ๊ด€๋ฆฌํ•ด์ฃผ์ง€ ์•Š์„๊นŒ? ์•„๋งˆ ๋ณ€์ˆ˜๋ฅผ ์ฝ๊ณ  ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ค„๋“ฏ.
- ๊ทธ๋ ‡๋‹ค๋ฉด ์ถ”๊ฐ€์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„์€ ํ•„์š” ์—†๋‹ค.
TC:
- deepcopy๋Š” ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ๋‹ค deepcopy ๋œฐ ๋ฟ์ด๋‹ค. ์•„๋งˆ node ๊ฐœ์ˆ˜ + edge ๊ฐœ์ˆ˜์— ๋น„๋ก€ํ•ด์„œ ์‹œ๊ฐ„์ด
๊ฑธ๋ฆด๊ฒƒ ๊ฐ™๋‹ค. O(n + e).
"""

"""
# Definition for a Node.
class Node:
def __init__(self, val = 0, neighbors = None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []
"""

import copy
from typing import Optional


class Solution:
def cloneGraph(self, node: Optional["Node"]) -> Optional["Node"]:
return copy.deepcopy(node)


"""TC: O(e), SC: O(e)
๋…ธ๋“œ ๊ฐœ์ˆ˜ n๊ฐœ, ์—ฃ์ง€ ๊ฐœ์ˆ˜ e๊ฐœ
์•„์ด๋””์–ด:
dfs ๋Œ๋ฉด์„œ ๋…ธ๋“œ๋“ค์„ ๋ฉ”๋ชจํ•ด๋‘์ž. neighbors์— ํŠน์ • ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ• ๋•Œ ๋ฉ”๋ชจ์— ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ๊ฐ€์ ธ๋‹ค
์“ฐ๊ณ , ์—†์œผ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ฉ”๋ชจ์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
SC:
- ๋…ธ๋“œ ์ด n๊ฐœ๊ฐ€ memo์— ์˜ฌ๋ผ๊ฐ„๋‹ค. O(n).
- ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค neighbor๊ฐ€ ์žˆ๋‹ค. ๊ฐ edge๋งˆ๋‹ค neighbor ๋ฆฌ์ŠคํŠธ๋“ค์˜ ์ด ์•„์ดํ…œ ๊ฐœ์ˆ˜์— 2๊ฐœ์”ฉ ๊ธฐ์—ฌํ•œ๋‹ค. O(e).
- ๋”ํ•˜๋ฉด O(n + e). ์ฆ‰, ๋‘˜ ์ค‘ ๋” ํฐ ๊ฐ’์ด ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ์ง€๋ฐฐํ•œ๋‹ค.
...๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ผ์ฐจ์ ์ธ ๋ถ„์„์ธ๋ฐ, ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
- ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋”ฐ๋ฅด๋ฉด ์šฐ๋ฆฌ์—๊ฒŒ ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„๋Š” connected graph๋‹ค. ์ฆ‰, ์—ฃ์ง€ ๊ฐœ์ˆ˜๊ฐ€ n-1๊ฐœ ์ด์ƒ์ด๋‹ค.
- ์ฆ‰, O(n) < O(e)๊ฐ€ ๋ฌด์กฐ๊ฑด ์„ฑ๋ฆฝํ•˜๋ฏ€๋กœ, O(e) < O(n + e) < O(e + e) = O(e). ์ฆ‰, O(e).
TC:
- SC์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ถ„์„ ๊ฐ€๋Šฅ. O(e).
"""

"""
# Definition for a Node.
class Node:
def __init__(self, val = 0, neighbors = None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []
"""

from typing import Optional


class Solution:
def cloneGraph(self, node: Optional["Node"]) -> Optional["Node"]:
if node is None:
return node

memo = {}

def dfs(node):
if node not in memo:
new_node = Node(node.val, [])
memo[node] = new_node
new_node.neighbors = [dfs(i) for i in node.neighbors]
return memo[node]

return dfs(node)
64 changes: 64 additions & 0 deletions longest-common-subsequence/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
"""TC: O(m * n), SC: O(m * n)
์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ฐ๊ฐ m, n์ด๋ผ๊ณ  ํ•˜์ž.
์•„์ด๋””์–ด:
- ๋‘ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์กŒ๋Š”๋ฐ ๋์ด ๊ฐ™์€ ๋ฌธ์ž๋ผ๊ณ  ํ•˜์ž. ์ด ๊ฒฝ์šฐ lcs์˜ ๊ธธ์ด๋Š” ๊ฐ๊ฐ์˜ ๋ฌธ์ž์—ด์—์„œ
๋ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•œ ๋ฌธ์ž์—ด๋กœ lcs์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•œ ๊ฐ’์— 1์„ ๋”ํ•œ ๊ฐ’์ด๋‹ค.
- e.g.) abcz, bcdefz์˜ lcs ๊ธธ์ด๋ฅผ `x`๋ผ๊ณ  ํ•œ๋‹ค๋ฉด,
abc/z, bcdef/z์—์„œ ๋์˜ z๊ฐ€ ๊ฐ™์€ ๋ฌธ์ž๋‹ˆ๊นŒ ์ด๊ฒŒ lcs์— ๋“ค์–ด๊ฐ„๋‹ค ์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ,
abc, bcdef์˜ lcs ๊ธธ์ด๋Š” `x - 1`์ด ๋œ๋‹ค.
- ๋‘ ๋ฌธ์ž์—ด์˜ ๋ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ, ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ ๋ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ตฌํ•œ lcs์˜ ๊ธธ์ด๋‚˜
๋‘ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ ๋ ๋ฌธ์ž๋ฅผ ์ œ๊ณ ํ•˜๊ณ  ๊ตฌํ•œ lcs์˜ ๊ธธ์ด ๋‘˜ ์ค‘ ํฐ ๊ฐ’์ด ์›๋ž˜ ๋ฌธ์ž์—ด๋กœ ๊ตฌํ•œ lcs
์˜ ๊ธธ์ด๋‹ค.
- e.g.) abcz, bcdefy์˜ lcs ๊ธธ์ด๋ฅผ `x`๋ผ๊ณ  ํ•œ๋‹ค๋ฉด,
abc, bcdefy์˜ lcs ๊ธธ์ด์™€
abcz, bcdef์˜ lcs ๊ธธ์ด
๋‘˜ ์ค‘ ๋” ํฐ ๊ฐ’์„ ์ทจํ•˜๋ฉด ๋œ๋‹ค.
- LCS๋Š” ์œ ๋ช…ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฏ€๋กœ ์œ„์˜ ์„ค๋ช…์„ ์‹œ๊ฐ์ ์œผ๋กœ ์ž˜ ํ‘œํ˜„ํ•œ ์˜ˆ์‹œ๋“ค์„ ์˜จ๋ผ์ธ์ƒ์—์„œ ์‰ฝ๊ฒŒ
์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
- ์œ„์˜ ์•„์ด๋””์–ด๋ฅผ ์ ํ™”์‹์œผ๋กœ ๋ฐ”๊พธ๋ฉด
- ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ ์•ž i๊ธ€์ž๋กœ ๋งŒ๋“  ๋ฌธ์ž์—ด๊ณผ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ ์•ž j๊ธ€์ž๋กœ ๋งŒ๋“  ๋ฌธ์ž์—ด์˜
lcs์˜ ๊ธธ์ด๋ฅผ lcs(i, j)๋ผ๊ณ  ํ•˜์ž.
- ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ i๋ฒˆ์งธ ๊ธ€์ž์™€ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ j๋ฒˆ์งธ ๊ธ€์ž๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ ๋‹ค์Œ์˜ ์‹์ด ์„ฑ๋ฆฝ.
- lcs(i, j) = lcs(i-1, j-1) + 1
- ๋‹ค๋ฅผ ๊ฒฝ์šฐ, ๋‹ค์Œ์˜ ์‹์ด ์„ฑ๋ฆฝ.
- lcs(i, j) = max(lcs(i-1, j), lcs(i, j-1))
- ์œ„์˜ ์•„์ด๋””์–ด๋ฅผ memoize๋ฅผ ํ•˜๋Š” dp๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋“œ ์ฐธ์กฐ.
SC:
- ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ ์•ž i๊ธ€์ž๋กœ ๋งŒ๋“  ๋ฌธ์ž์—ด๊ณผ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ ์•ž j๊ธ€์ž๋กœ ๋งŒ๋“  ๋ฌธ์ž์—ด์˜ lcs์˜
๊ธธ์ด๋ฅผ ๊ด€๋ฆฌ.
- ๊ทธ๋Ÿฐ๋ฐ ์•„์ด๋””์–ด์— ์ œ์‹œ๋œ ์ ํ™”์‹์„ ๋ณด๋ฉด i, j๊ฐ’์— ๋Œ€ํ•œ ์ „์ฒด ๋ฐฐ์—ด์„ ์ €์žฅํ•  ํ•„์š” ์—†์ด i=k์ผ๋•Œ
๊ฐ’์„ ๊ตฌํ•˜๋ ค ํ•œ๋‹ค๋ฉด i=k-1์ผ๋•Œ ๊ตฌํ•œ lcs๊ฐ’๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค.
- ์ฆ‰, ๋ฐฐ์—ด์€ ํ˜„์žฌ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” i๊ฐ’์— ๋Œ€ํ•œ j๊ฐœ์˜ ์•„์ดํ…œ๊ณผ ์ง์ „์— ๊ตฌํ•œ j๊ฐœ์˜ ์•„์ดํ…œ๋งŒ ์ €์žฅํ•˜๋ฉด
์ถฉ๋ถ„ํ•˜๋‹ค. ์ฆ‰, text2์˜ ๊ธธ์ด์ธ O(n)์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
- ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ text2์˜ ๊ธธ์ด๊ฐ€ text1๋ณด๋‹ค ๊ธธ๋ฉด ์ด ๋‘˜์„ ๋ฐ”๊ฟ”์น˜๊ธฐํ•ด์„œ ์œ„์˜ ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ O(m)์ด๋ผ๊ณ 
๋ด๋„ ์•„์ด๋””์–ด ์ž์ฒด๋Š” ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๊ฐ€?
- ์ฆ‰, O(min(m, n))
TC:
- dp ๋ฐฐ์—ด์„ ์ฑ„์šฐ๋Š” ๋ฐ์— ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ ๋‹จ์ˆœ ๋ง์…ˆ, ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๋‘ ๊ฐ’ ๋น„๊ต. ๋‘˜ ๋‹ค O(1).
- ๋ฐฐ์—ด ์ฑ„์šฐ๋Š” ๊ฒƒ์„ m * nํšŒ ๋ฐ˜๋ณตํ•˜๋ฏ€๋กœ ์ด O(m * n).
"""


class Solution:
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
if len(text2) > len(text1):
# ์ด ์ตœ์ ํ™”๊นŒ์ง€ ํ•ด์ฃผ๋ฉด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ๋งŽ์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค.
text1, text2 = text2, text1

dp = [[0 for _ in range(len(text2) + 1)] for _ in range(2)]

for i in range(1, len(text1) + 1):
i_prev = (i + 1) % 2
i_cur = i % 2
for j in range(1, len(text2) + 1):
dp[i_cur][j] = (
dp[i_prev][j - 1] + 1
if text1[i - 1] == text2[j - 1]
else max(dp[i_prev][j], dp[i_cur][j - 1])
)

return dp[i_cur][-1]
36 changes: 36 additions & 0 deletions longest-repeating-character-replacement/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
"""TC: O(n), SC: O(1)
n์€ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
์•„์ด๋””์–ด:
- ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์จ์„œ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘, ๋์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ ๋‹ค.
- ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์— ๋“ค์–ด์žˆ๋Š” ๋ฌธ์ž ์ค‘ ๊ฐ€์žฅ ๋งŽ์€ ๋ฌธ์ž์™€ k์˜ ํ•ฉ์ด ๋ฌธ์ž์—ด์˜ ๊ธธ์ด ๋ณด๋‹ค ํฌ๋ฉด ์กฐ๊ฑด ๋งŒ์กฑ.
- ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์— ๋“ค์–ด์žˆ๋Š” ๋ฌธ์ž ๊ฐœ์ˆ˜๋ฅผ dict๋ฅผ ์จ์„œ ๊ด€๋ฆฌํ•˜์ž.
SC:
- ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์— ๋“ค์–ด์žˆ๋Š” ๋ฌธ์ž ๊ฐœ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” dict์—์„œ O(1).
- ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘, ๋ ์ธ๋ฑ์Šค ๊ด€๋ฆฌ O(1).
- ์ข…ํ•ฉํ•˜๋ฉด O(1).
TC:
- ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๋ ์ธ๋ฑ์Šค๋ฅผ ํ•˜๋‚˜ ๋Š˜๋ฆด ๋•Œ๋งˆ๋‹ค ๋ฐ˜ํ™˜ํ•  ๊ฐ’ ์—…๋ฐ์ดํŠธ. O(1)์„ n๋ฒˆ ์‹œํ–‰ํ•˜๋ฏ€๋กœ O(n).
- ์‹œ์ž‘, ๋ ์ธ๋ฑ์Šค ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์— ๋“ค์–ด์žˆ๋Š” ๋ฌธ์ž ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ. ์‹œ์ž‘, ๋ ์ธ๋ฑ์Šค๋Š”
๋งŽ์ด ์ˆ˜์ •ํ•ด๋ด์•ผ ํ•ฉ์ณ์„œ 2*n๋ฒˆ. ์ฆ‰, O(1)์„ 2*n๋ฒˆ ์‹œํ–‰ํ•˜๋ฏ€๋กœ O(n).
- ์‹œ์ž‘, ๋ ์ธ๋ฑ์Šค์— 1์„ ๋”ํ•˜๋Š” ์‹œํ–‰. O(1)์„ 2*n๋ฒˆ ์‹œํ–‰ํ•˜๋ฏ€๋กœ O(n).
- ์ข…ํ•ฉํ•˜๋ฉด O(n).
"""


class Solution:
def characterReplacement(self, string: str, k: int) -> int:
char_cnt = {c: 0 for c in set(string)}
s = e = 0
sol = -1
while e < len(string):
char_cnt[string[e]] += 1
while e - s + 1 > max(char_cnt.values()) + k:
char_cnt[string[s]] -= 1
s += 1
sol = max(e - s + 1, sol)
e += 1
return sol
65 changes: 65 additions & 0 deletions merge-two-sorted-lists/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"""TC: O(n), SC: -
n์€ ์ฃผ์–ด์ง„ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด ์ค‘ ํฐ ๊ฐ’
์•„์ด๋””์–ด:
- ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ์˜ํ•ด ๋‘ ๋ฆฌ์ŠคํŠธ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’๋“ค์€ non-decreasing์ด๋ฏ€๋กœ, ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ 
๋‘ ๋ฆฌ์ŠคํŠธ์˜ ์•ž์— ์žˆ๋Š” ๊ฐ’ ์ค‘ ์ž‘์€ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๋ฝ‘์•„์„œ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
- ๋นˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋งŒ ์œ ์˜ํ•˜์ž.
SC:
- ํŠน๋ณ„ํžˆ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ’์ด ์—†๋‹ค.
TC:
- ๋ชจ๋“  ๋…ธ๋“œ์— ํ•œ ๋ฒˆ์”ฉ ์ ‘๊ทผํ•ด์„œ ๋ฆฌํ„ดํ•  ๊ฐ’์— ์ด์–ด์ค€๋‹ค. ์ด์–ด์ฃผ๋Š” ์‹œํ–‰๋งˆ๋‹ค O(1).
- ๋ฆฌํ„ดํ•  ๊ฐ’์— ์ƒˆ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ’ ๋น„๊ต๋ฅผ ํ•œ ๋ฒˆ์”ฉ ํ•œ๋‹ค. O(1).
- n์ด ๋‘ ๋ฆฌ์ŠคํŠธ ๊ธธ์ด ์ค‘ ํฐ ๊ฐ’์ด๋ฏ€๋กœ ์ด์–ด์ฃผ๋Š” ์‹œํ–‰์€ x๋Š” n <= x <= 2*n ๋งŒ์กฑ.
- ์ฆ‰, ์ด O(n).
"""

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeTwoLists(
self, list1: Optional[ListNode], list2: Optional[ListNode]
) -> Optional[ListNode]:
# 1. init head
# - ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด๊ณ  ํ˜น์‹œ ํ•˜๋‚˜๋ผ๋„ ๋น„์–ด์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
# - ๋‘˜ ๋‹ค ๋น„์–ด์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ฒซ ์•„์ดํ…œ์„ ๋ณด๊ณ  ๋‘˜ ์ค‘ ์ž‘์€ ๊ฐ’์„ ๊ฒฐ๊ณผ๋ฌผ์˜ ์ฒซ ์•„์ดํ…œ์œผ๋กœ ์”€.
if list1 is None:
return list2
if list2 is None:
return list1
# ์—ฌ๊ธฐ ๋„๋‹ฌํ–ˆ์œผ๋ฉด ๋‘˜ ๋‹ค ์ตœ์†Œํ•œ ํ•œ ์•„์ดํ…œ์”ฉ์€ ์กด์žฌ.
sol = None
if list1.val < list2.val:
sol = ListNode(list1.val)
list1 = list1.next
else:
sol = ListNode(list2.val)
list2 = list2.next

sol_head = sol

# 2. add item
# - ์•ž์˜ ๊ณผ์ •์„ ๋น„์Šทํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•œ๋‹ค.
while True:
# ์–ธ์  ๊ฐ€ ๋‘˜ ์ค‘ ํ•œ ๋ฆฌ์ŠคํŠธ๋Š” ๋น„๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋Œ์ง€ ์•Š๋Š”๋‹ค.
if list1 is None:
sol_head.next = list2
return sol
if list2 is None:
sol_head.next = list1
return sol

if list1.val < list2.val:
sol_head.next = ListNode(list1.val)
list1 = list1.next
else:
sol_head.next = ListNode(list2.val)
list2 = list2.next

sol_head = sol_head.next
133 changes: 133 additions & 0 deletions sum-of-two-integers/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
"""TC: O(1), SC: O(n^2)
-n <= a, b <= n ๊ฐ€์ •.
๋ฌธ์ œ์—์„œ๋Š” n์ด 1000์œผ๋กœ ์ฃผ์–ด์ ธ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์•„์ด๋””์–ด:
๋ง์…ˆ์„ ๋ชป ์“ฐ๊ฒŒ ํ•œ๋‹ค๋ฉด ์ „์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  a, b ์กฐํ•ฉ์— ๋Œ€ํ•œ ๋ง์…ˆ ๊ฐ’์„ ๋งŒ๋“ค์–ด๋†“๊ณ  a, b์˜ ๊ฐ’์— ๋”ฐ๋ผ์„œ
ํ•„์š”ํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜์ž. python์—์„œ๋Š” ์Œ์ˆ˜๋กœ ๋œ ์ธ๋ฑ์Šค๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์ด๋ฅผ ํ™œ์šฉํ•˜์ž.
- ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ „์ฒ˜๋ฆฌ๋œ ๊ฐ’์„ ์ค€๋น„ํ•œ๋‹ค. ์ด ์ฝ”๋“œ๋Š” leetcode์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋”ํ•˜๊ธฐ๋ฅผ
์จ๋„ ์ƒ๊ด€ ์—†๋‹ค.
```py
n = 3
with open("foo.txt", "w") as f:
a = [
[
(i if i <= n else i - 2 * n - 1) + (j if j <= n else j - 2 * n - 1)
for j in range(0, 2 * n + 1)
]
for i in range(0, 2 * n + 1)
]
f.write(str(a))
```
SC:
- O(n^2). ์ •ํ™•ํžˆ๋Š”, (2*n+1)^2 ๊ฐœ์˜ ์ •์ˆ˜๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.
TC:
- ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ์ ‘๊ทผ. O(1).
"""


class Solution:
# n = 3์ผ๋•Œ ์˜ˆ์‹œ.
def getSum(self, a: int, b: int) -> int:
x = [
[0, 1, 2, 3, -3, -2, -1],
[1, 2, 3, 4, -2, -1, 0],
[2, 3, 4, 5, -1, 0, 1],
[3, 4, 5, 6, 0, 1, 2],
[-3, -2, -1, 0, -6, -5, -4],
[-2, -1, 0, 1, -5, -4, -3],
[-1, 0, 1, 2, -4, -3, -2],
]
return x[a][b]


# ๋‹จ, n = 1000์ผ๋•Œ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ ค๊ณ  ํ•˜๋ฉด
# `For performance reasons, the number of characters per line is limited to 10,000.`
# ํ•˜๋Š” ๋ฌธ๊ตฌ์™€ ํ•จ๊ป˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณต๋ถ™ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค...


"""TC: O(n), SC: O(n)
-n <= a, b <= n ๊ฐ€์ •.
๋ฌธ์ œ์—์„œ๋Š” n์ด 1000์œผ๋กœ ์ฃผ์–ด์ ธ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์•„์ด๋””์–ด:
์ „์ฒ˜๋ฆฌ ํ•œ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋ชป ์“ฐ๊ฒŒ ๋˜์—ˆ์ง€๋งŒ, ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ์€ ์•„์ง ๊ทธ๋Œ€๋กœ ์“ฐ๊ณ  ์‹ถ๋‹ค.
- ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋ฐ”๊ฟ”์„œ 0 <= a, b <= n๋ผ๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋ฆฌ๊ณ  n์ด 3์ด๋ผ๊ณ  ํ•ด๋ณด์ž.
- a๊ฐ€ 0์œผ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์ฃผ์–ด์กŒ์„๋•Œ a+b์˜ ๊ฐ’์„ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
- v = [0, 1, 2, 3] ์ผ๋•Œ a + b ๊ฐ’์€ v[b]
- a๊ฐ€ 1๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋ฉด,
- v = [1, 2, 3, 4] ์ผ๋•Œ a + b ๊ฐ’์€ v[b]
- a๊ฐ€ 2๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋ฉด,
- v = [2, 3, 4, 5] ์ผ๋•Œ a + b ๊ฐ’์€ v[b]
- a๊ฐ€ 3์œผ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋ฉด,
- v = [3, 4, 5, 6] ์ผ๋•Œ a + b ๊ฐ’์€ v[b]
- ์œ„์˜ ๋ฐฐ์—ด์„ ๋ณด๋ฉด ๊ฒน์น˜๋Š” ์ˆซ์ž๋“ค์ด ๋งŽ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด 0~6๊นŒ์ง€ ์ˆซ์ž๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์„ slicingํ•ด์„œ
์“ฐ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?
- a๊ฐ€ 0์ผ๋•Œ v = [0, 1, 2, 3, 4, 5, 6] ์ค‘
[0, 1, 2, 3] ์‚ฌ์šฉ.
์ฆ‰, v[0:4] ์‚ฌ์šฉ.
- a๊ฐ€ 1์ผ๋•Œ v = [0, 1, 2, 3, 4, 5, 6] ์ค‘
[1, 2, 3, 4] ์‚ฌ์šฉ.
์ฆ‰, v[1:5] ์‚ฌ์šฉ.
...
- ์ผ๋ฐ˜ํ™”ํ•˜๋ฉด, v[a:a+n+1] ์‚ฌ์šฉ. ์ด๋•Œ a+b ๊ฐ’์€ v = list(range(0, 2 * n + 1))์ผ๋•Œ v[a:a+n+1][b].
- ๊ทธ๋Ÿฐ๋ฐ v[a:a+n+1][b]๋ฅผ ๋ณด๋ฉด ์Šฌ๋ผ์ด์‹ฑ ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ + ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
- ๊ทธ๋ ‡๋‹ค๋ฉด ์ €๊ธฐ์„œ ๋”ํ•˜๊ธฐ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด ์Šฌ๋ผ์ด์‹ฑ์˜ ์‹œ์ž‘ ๊ฐ’๊ณผ ๋ ๊ฐ’๋„ ๋ฏธ๋ฆฌ ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค๊ณ ,
์ด ๋ฆฌ์ŠคํŠธ์—์„œ a๋ฒˆ์งธ ์•„์ดํ…œ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์„ ํ™œ์šฉํ•ด๋ณด์ž.
- s = [0, 1, 2, 3], e = [4, 5, 6, 7]์ผ๋•Œ, v[a:a+n+1][b] = v[s[a]:e[a]][b]๊ฐ€ ๋œ๋‹ค.
- ์ผ๋ฐ˜ํ™”ํ•˜๋ฉด, s = list(range(0, n)), e = list(range(n+1, 2*n+1))์ด๋ฉด ๋œ๋‹ค.
- e๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋”ํ•˜๊ธฐ๋ฅผ ์“ด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” n์ด ์ฃผ์–ด์ง„ ์ƒ์ˆ˜์ด๋ฏ€๋กœ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.
- ์˜ˆ๋ฅผ ๋“ค์–ด, n=3์ผ๋•Œ e = list(range(4, 7))์ด๋‹ค.
ํฐ ์•„์ด๋””์–ด๋Š” ์œ„์˜ ๋ฐฉ์‹์œผ๋กœ ์„ค๋ช…์ด ๋๋‚ฌ๋‹ค. ์ด์ œ ๋ฌธ์ œ๋Š” 0 <= a, b <= n์ด ์•„๋‹ˆ๋ผ -n <= a, b <= n ๋ฒ”์œ„์—์„œ๋„
์œ„์˜ ๋ฐฉ์‹์ด ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ๋จผ์ € a๊ฐ’์€ ์–‘์ˆ˜ ๋ฒ”์œ„์— ๋‘๊ณ  b๊ฐ’๋งŒ ์Œ์ˆ˜๋กœ ํ™•์žฅํ•œ ์ƒํƒœ์—์„œ v๋ฅผ ๊ตฌํ•ด๋ณด๊ณ ,
๊ทธ ๋‹ค์Œ a๋„ ์Œ์ˆ˜๊นŒ์ง€ ํ™•์žฅํ•˜๋Š” ์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ณ , ๋‘˜ ๋‹ค ์Œ์ˆ˜ ๋ฒ”์œ„๊นŒ์ง€ ํ™•์žฅํ•œ ๋’ค
์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฌผ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€์‹ ํ•˜๊ฒ ๋‹ค.
- n์€ 3์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ๋‹ค.
- v = [0, 1, 2, 3, 4, 5, 6, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, -6, -5, -4, -3, -2, -1]
- list(range(0, n+1))์— list(range(-n, 0))์„ ์ด์–ด๋ถ™์ธ ๊ฒƒ์„ ๋‘ ๋ฒˆ ๋ฐ˜๋ณตํ–ˆ๋‹ค.
- ๋‘ ๋ฒˆ ๋ฐ˜๋ณตํ•œ ์ด์œ ๋Š” a๊ฐ’์ด ์Œ์ˆ˜๊ฐ€ ๋œ ์ƒํ™ฉ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์•„๋ž˜์˜ ์„ค๋ช…์„ ์ด์–ด์„œ ๋ณด๋„๋ก ํ•˜์ž.
- s = list(range(0, 4 * n + 1)) = list(range(0, 13))์ด๋‹ค.
- ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด a๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋˜์—ˆ์„๋•Œ๋„ slicing์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค๋Š” ์–‘์ˆ˜๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
- b๋ฅผ 0์œผ๋กœ ๊ณ ์ •ํ•˜๋ฉด slicing์„ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค์— ์žˆ๋Š” ์•„์ดํ…œ์ด a+b์˜ ๊ฐ’์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.
- ์ด๋ฅผ ์œ„์˜ v์™€ ๊ฐ™์ด ์ƒ๊ฐํ•˜๋ฉด v์˜ ์•ž 13๊ฐœ ์•„์ดํ…œ์„ ์ทจํ•œ [0, 1, 2, 3, 4, 5, 6, -6, -5, -4, -3, -2, -1]
๋ฐฐ์—ด์ด ์žˆ์„๋•Œ a๊ฐ€ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ๋ฒ”์œ„๋Š” -3~3์ด๋ฏ€๋กœ [0, 1, 2, 3, ..., -3, -2, -1] ์ค‘ ํ•˜๋‚˜๋ถ€ํ„ฐ
slicing์ด ์‹œ์ž‘๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
- ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์‰ฝ๊ฒŒ ๋งํ•ด์„œ a์˜ ๋ฒ”์œ„๋กœ ์ธํ•ด slicing์ด ์•„์ดํ…œ 4๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ [4, 5, 6, -6, ...] ํ•˜๋Š” ์ผ์ด
์ผ์–ด๋‚˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ๋œป.
- slicingํ•œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 4*n+1์ด์–ด์•ผ ํ•œ๋‹ค. e๋Š” s์˜ ๊ฐ ์•„์ดํ…œ์— 4*n+1์„ ๋”ํ•œ ๊ฐ’์ด๋ฉด ๋œ๋‹ค.
- 4*n+1์€ ๊ด€์ฐฐ์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๋‹ค.a, b์˜ ํ•ฉ์˜ ์ตœ์†Œ๊ฐ€ -2*n, ์ตœ๋Œ€๊ฐ€ 2*n์ด์–ด์„œ ๊ทธ ์‚ฌ์ด์— ์žˆ๋Š”
์ˆซ์ž๋“ค์ด ์ด 4*n+1๊ฐœ ์žˆ๋‹ค๋Š” ๊ฒƒ์—์„œ ๋น„๋กฏ๋œ ์ˆซ์ž๋‹ค.
- ๋์— ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์ข€ ๋” ํŽธํ•˜๋‹ค.
- ์ •๋ฆฌํ•˜๋ฉด, e = list(range(4*n+1, 8*n+2)) = list(range(13, 26))์ด๋‹ค.
- a+b ๊ฐ’์€ v[s[a] : e[a]][b] ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์˜ˆ๋ฅผ ๋“ค์–ด, a=2, b=-3์ด๋ผ๊ณ  ํ• ๋•Œ
- v[s[a] : e[a]] = v[2:15] = [2, 3, 4, 5, 6, -6, -5, -4, -3, -2, -1, 0, 1]๋‹ค.
- b๊ฐ€ -3์ด๋ฏ€๋กœ ์œ„์˜ slicing๋œ ๋ฐฐ์—ด์—์„œ ๋’ค์—์„œ ์„ธ ๋ฒˆ์งธ ์•„์ดํ…œ์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ์ฆ‰, -1์ด๋‹ค.
- ์ž˜ ๊ด€์ฐฐํ•˜๋ฉด ๋ง์…ˆ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ [2, 3, 4, 5, ..., -1, 0, 1] ๋ฐ–์— ์—†๋‹ค. ์‚ฌ์ด์— ์žˆ๋Š” ์ˆซ์ž๋Š”
b์˜ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์–ด์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ, ์ฆ‰, ํ•„์š” ์—†๋Š” ์ˆซ์ž๋“ค์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
SC:
- ์ฝ”๋“œ ์ฐธ์กฐ. O(n).
TC:
- ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ์ ‘๊ทผ. O(1).
"""


class Solution:
def getSum(self, a: int, b: int) -> int:
x = list(range(0, 2001))
x.extend(list(range(-2000, 0)))
v = x * 2 # SC: O(n)
s = list(range(0, 4001)) # SC: O(n)
e = list(range(4001, 8002)) # SC: O(n)
return v[s[a] : e[a]][b]

0 comments on commit ad69c40

Please sign in to comment.