[백준] 미로만들기 (2665)(kotlin)
문제 설명
입력 및 출력
» 입력
첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다.
» 출력
첫 줄에 흰 방으로 바꾸어야 할 최소의 검은 방의 수를 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
8 11100110 11010010 10011010 11101100 01000111 00110001 11011000 11000111 |
2 |
문제 풀이1
import java.util.LinkedList
var N = 0
var matrix = arrayOf<IntArray>()
var check = arrayOf<IntArray>()
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
N = readLine().toInt()
matrix = Array(N) { IntArray(N) }
check = Array(N) { IntArray(N) { Int.MAX_VALUE } }
for (y in 0 until N) {
val str = readLine()
for (x in 0 until N) {
matrix[y][x] = str[x] - '0'
}
}
check[0][0] = 0
bfs(0, 0)
println(check[N - 1][N - 1])
}
fun bfs(x: Int, y: Int) {
val dx = intArrayOf(0,0,1,-1)
val dy = intArrayOf(1,-1,0,0)
val q = LinkedList<Pair<Int, Int>>()
q.add(Pair(0, 0))
while (q.isNotEmpty()) {
val now = q.poll()
for (i in 0 until 4) {
val nx = now.first + dx[i]
val ny = now.second + dy[i]
if (nx !in 0 until N || ny !in 0 until N) continue
if (check[ny][nx] <= check[now.second][now.first]) continue
if (matrix[ny][nx] == 1) {
q.add(Pair(nx, ny))
check[ny][nx] = check[now.second][now.first]
} else {
q.add(Pair(nx, ny))
check[ny][nx] = check[now.second][now.first] + 1
}
}
}
}