[LeetCode]Search a 2D Matrix

2023. 5. 27. 20:35·SW개발/코딩테스트

https://leetcode.com/problems/search-a-2d-matrix/description/

 

Search a 2D Matrix - LeetCode

Can you solve this real interview question? Search a 2D Matrix - You are given an m x n integer matrix matrix with the following two properties: * Each row is sorted in non-decreasing order. * The first integer of each row is greater than the last integer

leetcode.com

 

문제 분석

주어진 2D Matrix에 target 값이 존재하는지를 찾는 문제입니다.

 

처음 시도한 답안

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        left = 0
        right = len(matrix)-1

        while left <= right:
            mid = (left+right) // 2

            if matrix[mid][0] <= target <= matrix[mid][-1]:
                break

            if matrix[mid][0] < target:
                left = mid + 1
            else:
                right = mid -1
        
        for num in matrix[mid]:
            if num == target:
                return True
        
        return False

 

접근 방법

  1. 이분 탐색을 진행하면서 target이 속한 row index를 구합니다.
  2. 해당 row를 순회하면서 target을 찾는다면 True 못찾는다면 False를 return 합니다.

문제의 제약조건으로 O(log(m*n)) 의 시간복잡도가 있었기에 이분 탐색을 활용 했습니다. 먼저 target의 위치할 수 있는 범위의 row index 값을 구했습니다. 그 뒤에 row를 순회하면서 정답을 구했습니다.

 

두번째로 시도한 답안

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        row = len(matrix)
        col = len(matrix[0])

        left = 0
        right = (row*col)-1
        
        while left <= right:
            mid = (left+right) // 2
            num = matrix[mid//col][mid%col]

            if num == target:
                return True

            if num > target:
                right = mid-1
            else:
                left = mid+1

        return False

접근 방법

  1. 이분 탐색을 사용하는 것은 동일합니다.
  2. 숫자를 탐색할 때 이차원 grid를 1차원인 것처럼 생각합니다.
  3. num이 위치한 곳을 구하기 위해서 matrix[mid // col][mid % col]의 연산을 활용합니다.
    mid 값을 col의 갯수로 몫을 구하는 연산을 한다면 어느 row에 위치한지 알 수 있습니다.
    mid 값을 col의 갯수로 나머지를 구하는 연산을 한다면 어느 col에 위치한지 알 수 있습니다.
  4. 나머지는 이분탐색과 모두 동일합니다.

첫번째의 방법에 비해서 한번의 loop로 최적화한 방법입니다. 이차원의 요소들을 마치 1차원인 것처럼 생각하는 것이 최적화 포인트입니다. 

row는 몫을 구하는 연산, col은 나머지 연산으로 그 위치를 구할 수 있습니다. 굉장히 좋은 방법이라고 생각됩니다.

 

728x90

'SW개발 > 코딩테스트' 카테고리의 다른 글

[LeetCode]Subsets  (0) 2023.05.29
[LeetCode]Sort Colors  (0) 2023.05.28
[LeetCode]Set Matrix Zeroes  (0) 2023.05.26
[LeetCode]Minimum Path Sum  (0) 2023.05.25
[LeetCode]Jump Game  (0) 2023.05.24
'SW개발/코딩테스트' 카테고리의 다른 글
  • [LeetCode]Subsets
  • [LeetCode]Sort Colors
  • [LeetCode]Set Matrix Zeroes
  • [LeetCode]Minimum Path Sum
Leffe_pt
Leffe_pt
개발자로서 성장하면서 배워온 지식과 경험을 공유하는 공간입니다.
  • Leffe_pt
    Leffe's tistory
    Leffe_pt
  • 전체
    오늘
    어제
    • 분류 전체보기 (309)
      • SW개발 (305)
        • 코딩테스트 (172)
        • 개발이야기 (23)
        • IT 용어 (17)
        • Python (22)
        • Django (46)
        • Flask (2)
        • Database (3)
        • SQLAlchemy (0)
        • Javascript (5)
        • Linux, Unix (3)
        • JAVA (2)
        • Spring (10)
      • 회고 (4)
      • 사진 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오픈소스
    배달
    플레이스토어
    어플리케이션
    django
    g
    배달비 공유
    트리 #AVL #알고리즘 #자료구조
    라이프 스타일
    음식
    Contributor
    컨트리뷰터
    배공파용
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Leffe_pt
[LeetCode]Search a 2D Matrix
상단으로

티스토리툴바