해당 내용은 ‘파이썬 알고리즘 인터뷰’ 책의 일부를 발췌하여 정리한 내용입니다.

2D 행렬 검색 ll

m*n 행렬에서 값을 찾아내는 효율적인 알고리즘을 구현하라.

Input: 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
Output: true
  • 나의 풀이 : 이중 for문

우선 간단하게 이중 for문을 사용하여 문제를 풀이하였다. 파이썬다운 방식으로 풀이하려고 노력한 코드이나, 시간상 효율적인 코드는 아니다.

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for line in matrix:
            for i in line:
                if i == target:
                    return True
  • 풀이: 행 뒷쪽에서 탐색
class Solution:
    def searchMatrix(self, matrix, target):
        # 예외 처리
        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
  • 풀이: 가장 파이썬다운 방식
class Solution:
    def searchMatrix(self, matrix, target):
        return any(target in row for row in matrix)

🤔 any()와 all() 함수

any()는 포함된 값중 하나라도 참이면 항상 참으로 출력한다.

>>> any([True, False, False)]
True

반면 all()은 모든 값이 참이여야 True를 출력한다.

>>> all([True, False, False)]
False
>>> all([True, True, True)]
True