[BFS] 백준 실버1 2178번: 미로 탐색(Swift)

2023. 5. 16. 17:30·코테

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

풀이과정

그래프이면서, 최단거리를 찾는 문제이기 때문에,

BFS를 활용하는 것이 가장 알맞은 방법이다.

BFS를 구현하기 위해선 Queue를 활용해야하기 때문에 먼저 Queue를 구현하였다.

struct Queue<T> {
  var memory = [T]()
  var index = 0
  
  var isEmpty: Bool {
    memory.count < index + 1
  }
  
  mutating func inQueue(element: T) {
    memory.append(element)
  }
  
  mutating func deQueue() -> T {
    let v = memory[index]
    index += 1
    return v
  }
}

위와 같이 간단하게 Queue처럼 동작할 수 있는 구조체를 구현하였다.

Queue 같은 경우 Stack을 두개 사용하여 구현할 수도 있다.

그 다음은, 최단 거리를 계산하기 위해 좌표에 따른 최단거리를 저장하는 distance이라는 배열을 두어 (1, 1)에서 부터 좌표에 따른 최단거리를 저장하여 문제를 해결할 수 있다.

struct Queue<T> {
  var memory = [T]()
  var index = 0
  
  var isEmpty: Bool {
    memory.count < index + 1
  }
  
  mutating func inQueue(element: T) {
    memory.append(element)
  }
  
  mutating func deQueue() -> T {
    let v = memory[index]
    index += 1
    return v
  }
}

let nm = readLine()!.split(separator: " ").map{ Int($0)! }

let n = nm[0]
let m = nm[1]

var map = [[Int]]()
var distance = Array(repeating: Array(repeating: 1, count: m + 1), count: n + 1)

for _ in 0..<n {
  let y = readLine()!
  var arr = Array(y)
  arr.insert("0", at: 0)
  map.append(arr.map { Int(String($0))! })
}

map.insert(Array(repeating: 0, count: m + 1), at: 0)


func bfs(start: (y: Int, x: Int)) {
  let lrud: [(y: Int, x: Int)] = [
    (0,-1),
    (0,1),
    (-1,0),
    (1,0)
  ]
  var q = Queue<(y: Int, x: Int)>()
  q.inQueue(element: start)
  map[start.y][start.x] = 0

  while !q.isEmpty {
    let p = q.deQueue()

    for i in 0..<4 {
      let next: (y: Int, x: Int) = (p.y + lrud[i].y, p.x + lrud[i].x)
      if (1...n).contains(next.y) && (1...m).contains(next.x) {
        if map[next.y][next.x] == 1 {
          map[next.y][next.x] = 0
          distance[next.y][next.x] += distance[p.y][p.x]
          q.inQueue(element: next)
        }
      }
    }
  }
}

bfs(start: (1,1))
print(distance[n][m])

 

저작자표시 (새창열림)

'코테' 카테고리의 다른 글

[완전 탐색] 백준 브론즈1 10448번: 유레카 이론(Swift)  (0) 2023.05.18
[구현] 백준 실버5 20546번: 기적의 매매법(Swift)  (1) 2023.05.16
[다이나믹 프로그래밍] 백준 실버3 1463번: 1로 만들기(Swift)  (0) 2023.05.16
[구현 + 재귀] 백준 실버5 17478번: 재귀함수가 뭔가요?(Swift)  (0) 2023.05.15
[그리디] 백준 브론즈1 4796번: 캠핑(Swift)  (0) 2023.05.15
'코테' 카테고리의 다른 글
  • [완전 탐색] 백준 브론즈1 10448번: 유레카 이론(Swift)
  • [구현] 백준 실버5 20546번: 기적의 매매법(Swift)
  • [다이나믹 프로그래밍] 백준 실버3 1463번: 1로 만들기(Swift)
  • [구현 + 재귀] 백준 실버5 17478번: 재귀함수가 뭔가요?(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

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

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    브루트포스 알고리즘
    Race Condition
    챌린지
    회고
    photoUI
    동시성
    GCD
    재귀
    구현
    dfs
    photos
    완전탐색
    탐색
    그리디
    백준
    노드
    네부캠
    Swift
    PhotoKit
    ios
    코테
    BFS
    알고리즘
    이분탐색
    Property wrapper
    비동기
    Combine
    다이나믹 프로그래밍
    실버
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[BFS] 백준 실버1 2178번: 미로 탐색(Swift)
상단으로

티스토리툴바