이진검색
들어가기 전에
- bisect.bisect_left 는 대표적인 이진검색 함수이다.
- 만약 위의 함수를 사용할 수 없는 상황이면 left, right 포인터와 반복문을 사용해보자.
Question 69: 2D 행렬의 검색2
$m \times n$ 행렬에서 값을 찾아내는 효율적인 알고리즘을 구현하라. 행렬은 왼쪽에서 오른쪽, 위에서 아래로 오름차순으로 정렬되어 있다.
입력: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
출력: True
내 풀이
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
for lst in matrix:
index = bisect.bisect_left(lst, target)
if len(lst) > 0 and len(lst) > index and lst[index] == target:
return True
return False
결과
Runtime: 172 ms, faster than 90.95% of Python3 online submissions for Search a 2D Matrix II. Memory Usage: 20.5 MB, less than 43.81% of Python3 online submissions for Search a 2D Matrix II.
중요 내용
- bisect_left(nums, target)는 정렬된 순서를 유지하도록 nums에 target을 삽입할 위치를 찾는다. 만약 target 값이 nums 안에 있을 경우 그 값의 인덱스를 리턴한다.
풀이 1: 첫 행의 맨 뒤에서 검색
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
if not matrix:
return False
row = 0
col = len(matrix[0])-1
while row <= len(matrix) - 1 and col >= 0:
if target == matrix[row][col]:
return True
elif target < matrix[row][col]:
col -= 1
elif target > matrix[row][col]:
row += 1
return False
중요 내용
- row와 col의 초기 값을 다음과 같이 설정해도 코드가 정상적으로 실행된다.
row = len(matrix) - 1
col = 0
while row >= 0 and col <= len(matrix[0]) - 1:
if target == matrix[row][col]:
return True
elif target > matrix[row][col]:
col += 1
elif target < matrix[row][col]:
row -= 1
풀이 2: 파이썬다운 방식
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
return any(target in row for row in matrix)
중요 내용
- any() 함수는 포함된 값 중 어느 하나가 참이라면 항상 참으로 출력한다. 논리 연산의 OR과 비슷하다.
- all() 함수는 모든 값이 참이어야 참을 리턴한다. 논리 연산의 AND와 비슷하다.
Comments