itisjustK
코딩과 사람 사는 이야기
itisjustK
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • 일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠.. (0)
    • Web (43)
      • html & css (9)
      • django & python (15)
      • java script (9)
    • iOS (51)
      • Swift (42)
      • SwiftUI (5)
    • CS (25)
      • 자료구조 (6)
      • 운영체제 (3)
      • 데이터베이스 (9)
      • 네트워크 (7)
    • PS (34)
      • 알고리즘 & 자료구조 (0)
    • Life (36)
    • Retrospective (15)
    • Book (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 생활코딩 #이고잉 #HTML #코딩 #개발자
  • 어플
  • binding
  • AppleDevloperAcademy
  • ios
  • 독립서점
  • mongodb
  • POSTECH
  • 킨디
  • CoreData
  • crud
  • 생활코딩
  • 개발자
  • 세그멘테이션
  • CS
  • 점주
  • 연결리스트
  • SWIFT
  • SwiftUI
  • nosql

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
itisjustK

코딩과 사람 사는 이야기

[Leetcode - Swift] 1091 Shortest Path in Binary Matrix
PS

[Leetcode - Swift] 1091 Shortest Path in Binary Matrix

2023. 2. 18. 19:36

문제

https://leetcode.com/problems/shortest-path-in-binary-matrix/description/

 

Shortest Path in Binary Matrix - LeetCode

Can you solve this real interview question? Shortest Path in Binary Matrix - Given an n x n binary matrix grid, return the length of the shortest clear path in the matrix. If there is no clear path, return -1. A clear path in a binary matrix is a path from

leetcode.com

 

풀이

이 문제는 그래프를 탐색하며 최단 거리를 구하는 문제로 그래프의 대표적인 유형 중 하나다.

나는 처음에 문제 접근을 잘못했다. 매번 노드를 탐색하는 과정을 dfs 재귀로 구현하려고 했다. (저번 문제에서 재귀를 배웠더니 이를 연습하려는 마음에 문제를 잘못 해석했던 것 같다.)

 

하지만, 이 문제는 최단 거리를 찾는 문제이므로 bfs를 통해 각 level을 일괄적으로 탐색해야 했다.

이렇게 bfs로 구현했음에도 불구하고 시간 초과가 떴는데, 그 이유는 큐에 방문할 노드를 추가하는 과정에서 (queue.append) 인접한 노드에 해당하면 모든 노드가 추가되었다. 즉, 중복이 모두 허용된 상태로 큐에 추가되다보니, 시간 초과가 발생할 수 밖에 없었다. 이를 피하기 위해 큐에 인접 노드를 추가하면서 곧바로 방문했다는 처리를 해주었더니, 그다음 노드부터 중복된 노드가 추가되지 않았다. (이를 알고 뒤늦게 다른 풀이들을 보니 다 중복 처리를 해주었다.)

 

처음 문제를 해석할 때는 쉽다고 판단했으나, 2hr 15min이나 걸렸다... 집중력도 문제 해결력도 최악 of 최악이었으나, 끝까지 풀어낸 것에 집중해서 긍정적으로 생각하자. 다음부터는 더 집중해서 문제를 풀어내자.

 

코드

import Foundation

class Solution {
    func shortestPathBinaryMatrix(_ grid: [[Int]]) -> Int {
        guard grid.count > 1 else { return grid[0][0] == 0 ? 1 : -1 }
        guard grid[0][0] == 0 && grid.last!.last! == 0 else { return -1 }
    
        return bfs(grid)
    }

    fileprivate func bfs(_ grid: [[Int]]) -> Int {
        var count = 0, mGrid = grid, queue = [(0,0)]
        let n = grid.count, dx = [-1,-1,0,1,1,1,0,-1], dy = [0,1,1,1,0,-1,-1,-1]

        while !queue.isEmpty {
            count += 1
            for _ in 0..<queue.count {
                let current = queue.removeFirst()
                
                if current.0 == (n-1) && current.1 == (n-1) {
                    return count
                }
                
                for i in 0..<8 {
                    let newX = current.0 + dx[i], newY = current.1 + dy[i]
                    if newX < n && newX >= 0 && newY < n && newY >= 0 && mGrid[newX][newY] == 0 {
                        queue.append((newX,newY))
                        mGrid[newX][newY] = 1
                    }
                }
            }
        }
        
        return -1
    }
}
저작자표시 (새창열림)

'PS' 카테고리의 다른 글

[Leetcode - Swift] 841. Keys and Rooms  (0) 2023.02.20
[PS] 간단한 Graph 개념과 BFS, DFS 템플릿  (0) 2023.02.20
[프로그래머스 - Swift] 오픈 채팅방 (2019 KAKAO BLIND RECRUITMENT)  (0) 2023.02.15
[Leetcode - Swift] 111. Minimum Depth of Binary Tree  (0) 2023.02.01
[Leetcode - Swift] 94. Binary Tree Inorder Traversal  (0) 2023.02.01
    'PS' 카테고리의 다른 글
    • [Leetcode - Swift] 841. Keys and Rooms
    • [PS] 간단한 Graph 개념과 BFS, DFS 템플릿
    • [프로그래머스 - Swift] 오픈 채팅방 (2019 KAKAO BLIND RECRUITMENT)
    • [Leetcode - Swift] 111. Minimum Depth of Binary Tree
    itisjustK
    itisjustK

    티스토리툴바