Search a 2D Matrix II | LeetCode 806 | Python3 ๐
๐ ๋ชฉ์ฐจ
๐ค ๋ฌธ์ : Search a 2D Matrix II | LeetCode 806
Matirx์์์ ํ๊ฒ๊ฐ์ด ์๋์ง ํ์ธํ๋ ๋ฌธ์ ์ ๋๋ค.
๋จ, Matrix๋ ๊ฐ ํ, ์ด์ด ๋ชจ๋ ์ ๋ ฌ๋์ด์์ต๋๋ค.
๐ก ํ์ด
1. ๊ฐ ์ด์ ๋ํด BS
๋น์ฐํ BS๋ก ์ ๊ทผํด์ผ ํ๋ ๋ฌธ์ ๋ก ์๊ฐํ์ต๋๋ค.
1) ๊ฐ ์ด์ ์ฒซ๋ฒ์งธ ํญ์ ์ํํฉ๋๋ค. ์ฒซ ํ์ ์ํํ๋๊ฒ ๋๊ฒ ์ฃ .
2) ์ด์ ์ฒซ๋ฒ์ฌ ๊ฐ์ด ํ๊ฒ๊ฐ๋ณด๋ค ์์ผ๋ฉด, ๊ทธ ์ด์ ํ๊ฒ๊ฐ์ด ์์ ์ ์๋ค๋ ๋ป์ด๊ฒ ์ฃ ? ํด๋น ์ด์ ๋ํด BS๋ฅผ ํฉ๋๋ค.
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
def bs(listIdx, st, ed):
if st > ed: return False
md = int((st + ed) /2)
if matrix[listIdx][md] == target: return True
if matrix[listIdx][md] < target: return bs(listIdx, md+1, ed)
return bs(listIdx, st, md-1)
for listIdx in range(len(matrix)): # ๊ฐ ์ด์ ๋ํด์
if matrix[listIdx][0] == target: return True
if matrix[listIdx][0] < target: # ์ฒซ๋ฒ์งธ ๊ฐ์ด ํ๊ฒ๊ฐ๋ณด๋ค ์์ผ๋ฉด BS
if bs(listIdx, 0, len(matrix[listIdx])-1):
return True
return False
Time Complexity
์ต์ ์ ๊ฒฝ์ฐ ๋ง์ง๋ง ์ด์ ํ๊ฒ๊ฐ์ด ์์ผ๋ฉด logN์ n๋ฒ ์ํํฉ๋๋ค.
O(NlogN)
2. BS๋ฅผ ์ฐ์ง ์๋ ํ์ด?!
1๋ฒํ์ด๊ฐ ์ข.. ๋ง๋ฌด๊ฐ๋ด์ธ๊ฐ(?) ํ๋ ์๊ฐ์ด ๋ค์ด ๋ค๋ฅธ ํ์ด๋ค์ ์ฐพ์๋ดค๋๋ฐ ์ญ์๋ ํ๊ธฐ์ ์ธ ํ์ด๊ฐ ์์์ต๋๋ค.
์ผ์ชฝ๋งจ ์๋ ๊ฐ ๋ถํฐ ํ๊ฒ๊ฐ์ ์ฐพ์๊ฐ๋๋ฐฉ์์ ๋๋ค.
ํ์ฌ ๋ณด๊ณ ์๋ ๊ฐ์ด ํ๊ฒ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด?
์ง๊ธ๋ณด๋ค ์ค๋ฅธ์ชฝ ์๋์๋ ํ๊ฒ๊ฐ์ด ์์ ์ ์๊ฒ ์ฃ . ํ์ฌ๊ฐ์ ์ค๋ฅธ์ชฝ ์๋์ชฝ์ ๋ค ํ์ฌ๊ฐ๋ณด๋ค ํฌ๋๊น์.
๊ทธ๋ผ ๋ณด๊ณ ์๋ ๊ฐ์ ์๋ก ํ ์นธ ์ฎ๊น๋๋ค.
ํ์ฌ ๋ณด๊ณ ์๋ ๊ฐ์ด ํ๊ฒ๊ฐ๋ณด๋ค ์๋ค๋ฉด?
์ง๊ธ๋ณด๋ค ์ผ์ชฝ ์์๋ ํ๊ฒ๊ฐ์ด ์์ ์ ์๊ฒ ์ฃ . ํ์ฌ๊ฐ์ ์ผ์ชฝ ์๋ ๋ค ํ์ฌ๊ฐ๋ณด๋ค ํฌ๋๊น์.
๊ทธ๋ผ ๋ณด๊ณ ์๋ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ฎ๊น๋๋ค.
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m = len(matrix)
n = len(matrix[0])
def solve(i, j):
if i < 0: return False
if j >= n: return False
if matrix[i][j] == target: return True
if matrix[i][j] < target: return solve(i, j+1)
if matrix[i][j] > target: return solve(i-1, j)
return solve(m-1, 0)
Time complexity
ํ๊ฒ๊ฐ์ด ํ๋ ฌ์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ๊ฐ์ฅ ์์ ์๋ ๊ฒฝ์ฐ๊ฐ ์ต์ ์ ๊ฒฝ์ฐ๊ฐ ๋๊ณ
์ด ๋์ time complexity๋ m:๊ฐ๋ก๊ธธ์ด, n:์ธ๋ก๊ธธ์ด๋ผ ํ ๋
O(m+n)