https://www.acmicpc.net/problem/14940
14940번: 쉬운 최단거리
지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이
www.acmicpc.net
난이도 : 실버 1
태그 : 그래프 이론, 그래프 탐색, 너비 우선 탐색
설명
모든 정점에 대해 최단거리를 출력하는 문제입니다.
BFS를 응용해 풀 수 있겠네요.
BFS를 사용한 최단거리 문제는 아래 포스팅을 참고해주세요.
https://uknowblog.tistory.com/24
[백준 2178번][Kotlin] 미로 탐색
https://www.acmicpc.net/problem/2178 2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다. www.a
uknowblog.tistory.com
소스코드
import java.util.*
fun main() = with(System.`in`.bufferedReader()) {
class Node(var x: Int, var y: Int)
val (n, m) = readLine().split(" ").map { it.toInt() }
val dx = arrayOf(1, -1, 0, 0)
val dy = arrayOf(0, 0, 1, -1)
val start = Node(-1, -1)
val notArrival = ArrayList<Node>()
val map = Array(n) { x ->
val st = StringTokenizer(readLine())
Array(m) { y ->
val num = st.nextToken().toInt()
if (num == 2) {
start.x = x
start.y = y
} else if (num == 0) {
notArrival.add(Node(x, y))
}
num
}
}
val visited = Array(n) { Array(m) { -1 } }
visited[start.x][start.y] = 0
val q = LinkedList<Node>() as Queue<Node>
q.offer(start)
while (q.isNotEmpty()) {
val target = q.poll()
for (i in 0 until 4) {
val nx = target.x + dx[i]
val ny = target.y + dy[i]
if (nx !in 0 until n || ny !in 0 until m || visited[nx][ny] != -1 || map[nx][ny] == 0) continue
visited[nx][ny] = visited[target.x][target.y] + 1
q.offer(Node(nx, ny))
}
}
notArrival.forEach { visited[it.x][it.y] = 0 }
val sb = StringBuilder()
visited.forEach {
it.forEach {
sb.append(it).append(" ")
}
sb.append("\n")
}
print(sb)
}
Node는 x, y 좌표를 담을 데이터 클래스입니다.
미로 찾기 문제와 비슷한데, 다른 점은, 목적지가 있는 것이 아닌, 모든 정점에 대해 최단거리를 출력한다는 점입니다.
따라서 특별한 종료조건 없이, 그냥 모든 정점을 다 탐색할때까지 BFS를 진행하면 됩니다.
후기
DFS, BFS는 정말 언제해도 재밌습니다.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 2251번] [Kotlin] 물통 (0) | 2023.04.17 |
---|---|
[백준 15683번] [Kotlin] 감시 (0) | 2023.04.16 |
[백준 3986번] [Kotlin] 좋은 단어 (0) | 2023.04.16 |
[백준 1747번] [Kotlin] 소수&팰린드롬 (0) | 2023.04.16 |
[백준 2720번] [Kotlin] 세탁소 사장 동혁 (0) | 2023.04.16 |