반응형

백준 1111번 문제입니다. (solved.ac) 기준 실버 1 문제입니다.

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

 

14716번: 현수막

혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.

www.acmicpc.net

문제

문제 접근

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
}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기