반응형
백준 1111번 문제입니다. (solved.ac) 기준 실버 1 문제입니다.
https://www.acmicpc.net/problem/14716
문제
문제 접근
2차원 배열로 0, 1을 입력받고 글자의 개수를 출력하는 문제입니다. 글자인 부분은 1, 글자가 아닌 부분은 0이라고 합니다.
2차원 배열의 모든 인덱스를 탐색하며 1이라는 값이나오면 해당 인덱스의 값은 0으로 바꿔주고(중복 탐색 방지)
상하좌우/ 좌상 좌하 우상 우하, 총 8개의 방향으로 탐색을 하여 1이 있는지 확인합니다.(글자는 이어져있으므로)
8개의 방향을 탐색하는 중 마찬가지로 1이 발견되었다면 해당 좌표에서도 동일하게 8방향을 탐색합니다.
이렇게 8방향 탐색과정은 인접한 8방향에 0이 존재하지 않을 때까지 반복됩니다.(이어진 1들은 1개의 글자이므로)
이렇게 탐색이 종료가 되었다면 글자 1개가 존재한다고 판정합니다.
정답 코드
package hyunsoo.`3week`
/**
* 나름 간단한 BFS문제인 것 같다?
* 9개의 방향을 모두 탐색하면 될듯!
* - 연결된 1들은 모두 0으로 바꾸고 1개로 처리하기!
*/
data class Pos(val x: Int, val y: Int)
// 상 하 좌 우 / 좌상 좌하 우상 우하
val searchPosList = listOf(
Pos(-1, 0),
Pos(1, 0),
Pos(0, -1),
Pos(0, 1),
Pos(-1, -1),
Pos(1, -1),
Pos(-1, 1),
Pos(1, 1),
)
val banner = mutableListOf<MutableList<Char>>()
var m = 0
var n = 0
fun main() {
readln().split(" ").map { it.toInt() }.apply {
m = this[0]
n = this[1]
}
var wordCnt = 0
repeat(m) {
val dataRow = readln().split(" ").map { it.first() }.toMutableList()
banner.add(dataRow)
}
for (i in 0 until m) {
for (j in 0 until n) {
if (bfs(i, j)) wordCnt++
}
}
println(wordCnt)
}
fun bfs(x: Int, y: Int): Boolean {
// 0 이면 애초에 글자가 아님.
if (banner[x][y] == '0') return false
banner[x][y] = '0'
searchPosList.forEach { pos ->
val nx = x + pos.x
val ny = y + pos.y
if (nx in 0 until m && ny in 0 until n) bfs(nx, ny)
}
return true
}
반응형
'알고리즘 문제풀이[Algorithm]' 카테고리의 다른 글
[백준] 3098번 소셜네트워크(그래프, 브루트포스)[Kotlin - 코틀린] (0) | 2022.10.01 |
---|---|
[백준] 5430번 AC[Kotlin - 코틀린] (0) | 2022.09.14 |
[백준] 1895번 필터(브루트 포스 - 완전 탐색)[Kotlin - 코틀린] (2) | 2022.09.13 |
[백준] 5555번 반지(브루트 포스 - 완전 탐색)[Kotlin - 코틀린] (0) | 2022.09.13 |
[백준] 2897번 몬스터 트럭(브루트포스 - 완전탐색)[Kotlin - 코틀린] (0) | 2022.09.13 |
최근댓글