문제
3184번: 양
첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.
www.acmicpc.net
풀이
큐를 이용한 너비 우선 탐색(BFS)으로 해결하였다. 반복문을 통해 울타리가 아닌 경우에 BFS 탐색을 수행하고 방문을 처리 해준다.
BFS 탐색에서는 큐의 현재 위치에서 네 방향으로 탐색을 수행한다. 만약 울타리가 아닌 경우에 큐에 해당 위치를 넣어준다. 탐색 범위 내에서 양과 늑대의 수를 세어준다. 탐색이 끝났을 때 양의 수가 늑대보다 많은 경우에는 살아 있는 양으로 판단하여 값을 더해주고, 아니 경우에는 늑대의 값을 더해준다.
코드
import java.util.*
data class Point(val x: Int, val y: Int)
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val (rows, cols) = br.readLine().split(' ').map { it.toInt() }
val map = Array(rows){ br.readLine() }
val visited = Array(rows){ BooleanArray(cols) }
val dx = arrayOf(1, 0, -1, 0)
val dy = arrayOf(0, 1, 0, -1)
var sheep = 0 // 살아있는 양
var wolf = 0 // 살아있는 늑대
fun bfs(x: Int, y: Int) {
val queue : Queue<Point> = LinkedList()
queue.add(Point(x, y))
visited[x][y] = true
var wCnt = 0
var sCnt = 0
if(map[x][y] == 'o') {
sCnt++
}
if(map[x][y] == 'v') {
wCnt++
}
while (queue.isNotEmpty()) {
val cur = queue.poll()
for(i in 0 until 4) {
val nx = cur.x + dx[i]
val ny = cur.y + dy[i]
if(nx < 0 || nx >= rows || ny < 0 || ny >= cols) continue
if(visited[nx][ny]) continue
if(map[nx][ny] == '#') continue // 울타리인 경우 넘어감
visited[nx][ny] = true
if(map[nx][ny] == 'o') {
sCnt++
}
if(map[nx][ny] == 'v') {
wCnt++
}
queue.add(Point(nx, ny))
}
}
if(sCnt > wCnt) { // 살아있는 양과 늑대의 수 계산
sheep += sCnt
} else {
wolf += wCnt
}
}
for(i in 0 until rows) {
for(j in 0 until cols) {
if(map[i][j] != '#' && !visited[i][j]) {
bfs(i, j)
}
}
}
bw.write("$sheep $wolf")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 2023번: 신기한 소수 - Kotlin[코틀린] (0) | 2024.04.17 |
---|---|
[백준] 15903번: 카드 합체 놀이 - Kotlin[코틀린] (0) | 2024.04.16 |
[백준] 11441번: 합 구하기 - Kotlin[코틀린] (0) | 2024.04.09 |
[백준] 11047번: 동전 0 - Kotlin[코틀린] (0) | 2024.04.01 |
[백준] 5052번: 전화번호 목록 - Kotlin[코틀린] (0) | 2024.03.27 |