Skip to content

Commit

Permalink
Merge pull request #484 from haklee/main
Browse files Browse the repository at this point in the history
[haklee] week 7
  • Loading branch information
haklee authored Sep 28, 2024
2 parents c127512 + 78436f9 commit 480e4b8
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 0 deletions.
51 changes: 51 additions & 0 deletions longest-substring-without-repeating-characters/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""TC: O(n), SC: O(n)
์•„์ด๋””์–ด:
ํˆฌํฌ์ธํ„ฐ๋กœ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘, ๋ ์ธ๋ฑ์Šค๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ž์—ด ์•ˆ์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ set์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
- ์‹œ์ž‘~๋ ์‚ฌ์ด์— ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋ฉด ๋ ์ธ๋ฑ์Šค๋ฅผ ํ•˜๋‚˜ ๋’ค๋กœ ์˜ฎ๊ธด๋‹ค.
- ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์˜ ์ œ์ผ ๋์— ์žˆ๋Š” ๋ฌธ์ž๊ฐ€ ํ˜น์‹œ set ์•ˆ์— ์žˆ์œผ๋ฉด ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ฅผ ๋’ค๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„
ํ•ด๋‹น ๋ฌธ์ž๋ž‘ ๊ฐ™์€ ๋ฌธ์ž๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•œ๋‹ค. ์ฆ‰, ๋์„ ๊ณ ์ •ํ•˜๊ณ  ์•ž์„ ๊ณ„์† ์˜ฎ๊ฒจ์„œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์—
์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ž๋“ค์ด ๋‹ค๋ฅธ ๋ฌธ์ž๊ฐ€ ๋˜๋„๋ก ๋งŒ๋“ ๋‹ค.
- e.g.) abcdefd -> abcdefd
^ ^ ^ ^
s e s e
- ์œ„์˜ ๊ณผ์ •์„ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋ฌธ์ž์—ด์˜ ์ตœ๋Œ€ ๊ธธ์ด ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
SC:
- ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘๊ณผ ๋ ์ธ๋ฑ์Šค ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์— O(1).
- ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌธ์ž๋ฅผ set์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์— ์ตœ์•…์˜ ๊ฒฝ์šฐ n๊ฐœ์˜ ๋ฌธ์ž๊ฐ€ ๋ชจ๋‘ ๋‹ค๋ฅผ๋•Œ O(n).
- ์ตœ๋Œ€ ๋ฌธ์ž์—ด ๊ธธ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์— O(1).
- ์ข…ํ•ฉํ•˜๋ฉด O(n).
TC:
- s, e๋Š” ๋ชจ๋‘ ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ s, e๊ฐ’์„ ์•„๋ฌด๋ฆฌ ๋งŽ์ด ์—…๋ฐ์ดํŠธ ํ•ด๋„ ๊ฐ๊ฐ€ ๋ฌธ์ž์—ด ๊ธธ์ด๋ณด๋‹ค
๋งŽ์ด ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์ฆ‰, O(n).
- set์—์„œ ํŠน์ • ๋ฌธ์ž๊ฐ€ ๋“ค์–ด์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๊ณ  set์— ๋ฌธ์ž๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ์— O(1). ์ด ์ž‘์—…์„ ์•„๋ฌด๋ฆฌ
๋งŽ์ด ํ•ด๋„ s, e๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ํšŒ์ˆ˜ ๋งŒํผ ์ง„ํ–‰ํ•˜๋ฏ€๋กœ ์ด O(n).
- ์ตœ๋Œ€ ๋ฌธ์ž์—ด ๊ธธ์ด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐ์— O(1). ์ด ๋˜ํ•œ ์•„๋ฌด๋ฆฌ ๋งŽ์ด ์ง„ํ–‰ํ•ด๋„ O(n).
- ์ข…ํ•ฉํ•˜๋ฉด O(n).
"""


class Solution:
def lengthOfLongestSubstring(self, string: str) -> int:
if len(string) < 1:
return 0
s = e = 0
letter_set = set([string[0]])
sol = 1
while True:
e += 1
if e == len(string):
break

if string[e] in letter_set:
while True:
letter_set.discard(string[s])
if string[s] == string[e]:
break
s += 1
s += 1
letter_set.add(string[e])
sol = max(len(letter_set), sol)
return sol
41 changes: 41 additions & 0 deletions number-of-islands/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""TC: O(m * n), SC: O(m * n)
์•„์ด๋””์–ด:
- ํŠน์ • ์นธ์ด 1์ผ ๊ฒฝ์šฐ ์ด์™€ ๊ฐ™์€ ์„ฌ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์นธ๋“ค์„ 0์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” `remove_ground` ํ•จ์ˆ˜ ๊ตฌํ˜„.
- grid ๋‚ด์˜ ๋ชจ๋“  ์นธ๋“ค์„ ๋Œ๋ฉด์„œ `remove_ground`๊ฐ€ ๋ช‡ ๋ฒˆ ์ตœ์ดˆ ํ˜ธ์ถœ(์ฆ‰, ์žฌ๊ท€ ํ˜ธ์ถœ ์•„๋‹˜) ๋˜์—ˆ๋Š”์ง€
์„ธ๋ฉด ์ „์ฒด ์„ฌ์ด ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
SC:
- ๋ชจ๋“  ์นธ์ด ์ „๋ถ€ 1์ผ ๊ฒฝ์šฐ remove_ground์˜ ํ˜ธ์ถœ ์Šคํƒ ๊นŠ์ด๊ฐ€ m*n์ด ๋œ๋‹ค. ์ฆ‰, O(m * n).
TC:
- ๊ฐ ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ 5๋ฒˆ์”ฉ ์ ‘๊ทผ๋  ์ˆ˜ ์žˆ๋‹ค.
- ์ด์›ƒํ•œ ์นธ์—์„œ remove_ground ํ•˜๋ฉด์„œ ์ ‘๊ทผ
- ์ตœ์™ธ๊ณฝ์—์„œ ํ•ด๋‹น ์นธ์ด 1์ธ์ง€ ์ฒดํฌํ•˜๋ฉด์„œ ์ ‘๊ทผ
- ์ ‘๊ทผํ•˜๊ณ  ๋‚˜์„œ ํ•˜๋Š” ์—ฐ์‚ฐ์ด O(1).
- ํ•ด๋‹น ์นธ์˜ ๊ฐ’์ด 1์ธ์ง€ ์ฒดํฌํ•˜๋Š” ๋ฐ์— O(1).
- check_inside ์—ฐ์‚ฐ์„ 4๋ฒˆ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ฐ๊ฐ O(1).
- ์ข…ํ•ฉํ•˜๋ฉด O(1).
- ์ข…ํ•ฉํ•˜๋ฉด O(m * n).
"""


class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
minx, miny, maxx, maxy = 0, 0, len(grid[0]) - 1, len(grid) - 1

def remove_ground(i, j):
if minx <= j <= maxx and miny <= i <= maxy and grid[i][j] == "1":
grid[i][j] = "0"
remove_ground(i - 1, j)
remove_ground(i + 1, j)
remove_ground(i, j - 1)
remove_ground(i, j + 1)

sol = 0
for i in range(maxy + 1):
for j in range(maxx + 1):
if grid[i][j] == "1":
sol += 1
remove_ground(i, j)
return sol
28 changes: 28 additions & 0 deletions reverse-linked-list/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"""TC: O(n), SC: O(1)
์•„์ด๋””์–ด:
์ฒซ ์•„์ดํ…œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ next๋กœ ๋„˜์–ด๊ฐ€๋ฉด์„œ ์ง์ „์— ๋ณด์•˜๋˜ ๋…ธ๋“œ๋ฅผ next์— ๋„ฃ์–ด์ค€๋‹ค.
SC:
- ์ง์ „ ๋…ธ๋“œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. O(1).
TC:
- ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ง์ „ ๋…ธ๋“œ๋ฅผ next์— ๋Œ€์ž…ํ•œ๋‹ค.
- ๊ทธ ์™ธ์— ๋‹ค๋ฅธ ์—ฐ์‚ฐ๋„ O(1). ์ฝ”๋“œ ์ฐธ์กฐ.
- ์ข…ํ•ฉํ•˜๋ฉด 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 reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
prev, cur = None, head
while cur:
next = cur.next
cur.next = prev
prev, cur = cur, next
return prev
38 changes: 38 additions & 0 deletions set-matrix-zeroes/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"""TC: O(m * n), SC: O(m + n)
์•„์ด๋””์–ด:
๋ชจ๋“  ์นธ์„ ํ›‘์œผ๋ฉด์„œ ์–ด๋–ค row, column์„ 0์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•˜๋Š”์ง€ ์ฐพ์€ ๋‹ค์Œ 0์œผ๋กœ ๋ฐ”๊พธ๋Š” ์‹œํ–‰์„ ํ•œ๋‹ค.
SC:
- ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š” column, row๋ฅผ set์œผ๋กœ ๊ด€๋ฆฌ. ๊ฐ๊ฐ O(m), O(n)์ด๋ฏ€๋กœ ์ข…ํ•ฉํ•˜๋ฉด O(m + n).
TC:
- ๋ชจ๋“  ์นธ์„ ๋Œ๋ฉด์„œ ์–ด๋–ค column๊ณผ row๋ฅผ 0์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค. O(m * n).
- 0์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š” ๋ชจ๋“  column์„ 0์œผ๋กœ ๋ฐ”๊พผ๋‹ค. ๋ชจ๋“  column์„ ๋‹ค 0์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•  ๊ฒฝ์šฐ ๋ชจ๋“  ์นธ์—
์ ‘๊ทผํ•ด์„œ 0์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ O(m * n).
- row๋„ column๊ณผ ๋˜‘๊ฐ™์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. O(m * n).
- ์ข…ํ•ฉํ•˜๋ฉด O(m * n).
"""


class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
m, n = len(matrix), len(matrix[0])
col_to_change, row_to_change = set(), set()

for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
col_to_change.add(i)
row_to_change.add(j)

for i in col_to_change:
for j in range(n):
matrix[i][j] = 0

for j in row_to_change:
for i in range(m):
matrix[i][j] = 0
31 changes: 31 additions & 0 deletions unique-paths/haklee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""TC: O(m + n), SC: O(1)
์•„์ด๋””์–ด:
์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๋Š” ํšŒ์ˆ˜ m-1, ์•„๋ž˜๋กœ ๊ฐ€๋Š” ํšŒ์ˆ˜ n-1์„ ์„ž์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.
์ฆ‰, m+n-2ํšŒ์˜ ์ด๋™ ์ค‘ m-1๊ฐœ๋ฅผ ๋ฝ‘์•„์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๊ณ , ๋‚˜๋จธ์ง€๋ฅผ ์•„๋ž˜๋กœ ๊ฐ€๋ฉด ๋œ๋‹ค.
์ฆ‰, (m+n-2)C(m-1)์„ ๊ณ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค.
ํฐ ์ˆ˜ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด nCk = n! / (k! * (n - k)!) ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค.
ํŒŒ์ด์ฌ์˜ math.comb ํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.
(ref: https://docs.python.org/ko/3/library/math.html#math.comb)
- math.comb(n, k)์„ ๊ณ„์‚ฐํ•˜๋ฉด k <= n์ด๋ฉด n! / (k! * (n - k)!)๋กœ ํ‰๊ฐ€๋˜๊ณ , k > n์ด๋ฉด 0์œผ๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.
์ด ํ•จ์ˆ˜๋ฅผ ์จ์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜์ž.
SC:
- ๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ ๊ฐ’ ๊ด€๋ฆฌ. O(1).
- ์•„์ฃผ ํฐ ์ˆซ์ž๋ฅผ ๋‹ค๋ฃฐ ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ๋ณด๋ฉด ์•ˆ ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ฌธ์ œ ์กฐ๊ฑด์„ ๋ณด์•„ํ•˜๋‹ˆ int64 ๋ฒ”์œ„ ๋‚ด์—์„œ
๊ณฑ์…ˆ๊ณผ ๋‚˜๋ˆ—์…ˆ ์—ฐ์‚ฐ ๊ฐ’๋“ค์ด ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ์ฆ‰, SC๊ฐ€ ๊ทธ๋ฆฌ ์ค‘์š”ํ•˜์ง€๋Š” ์•Š๋‹ค.
TC:
- (m+n-2)C(m-1) = (m+n-2)! / (m-1)! * (n-1)!
- ๊ฐ ๊ณฑ์…ˆ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐ์— O(m + n), O(m), O(n). ์…‹ ๋‹ค ๋”ํ•˜๋ฉด O(m + n).
- ๋‚˜๋ˆ—์…ˆ์— O(1).
- ์ข…ํ•ฉํ•˜๋ฉด O(m + n)
"""

from math import comb


class Solution:
def uniquePaths(self, m: int, n: int) -> int:
return comb(m + n - 2, n - 1)

0 comments on commit 480e4b8

Please sign in to comment.