(링크 : https://www.acmicpc.net/problem/2667)

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net


소스코드(BFS)

import java.io.BufferedReader
import java.io.FileInputStream
import java.io.InputStreamReader
import java.util.LinkedList
import java.util.Queue

private val MY = arrayOf(0,0,1,-1) //좌 ,우 ,위 ,아래
private val MX = arrayOf(-1,1,0,0) //좌 ,우 ,위 ,아래
private var N = 0   //정사각형 크기 (5이상 25이하)
private lateinit var map : MutableList<MutableList<Int>>
private val Q : Queue<Point> = LinkedList()

private var count = 0
private var danji = 0
private var countList = mutableListOf <Int>()

private fun main(){
    val br = BufferedReader(InputStreamReader(System.`in`))
    N = br.readLine().toInt()
    map = MutableList(N){br.readLine().map { it.digitToInt() }.toMutableList()}

    for (i in map.indices){
        for (j in map[i].indices){
            //처음 방문하는 단지 찾으면 BFS 돌려~
            if ((map[i][j] == 1)){
                map[i][j] = 0
                Q.add( Point(i,j) )
                count++
                bfs()
            }
        }
    }
    println(danji)
    countList.sorted().forEach { println(it) }
}

private fun bfs(){
    while (Q.isNotEmpty()){
        // 큐에서 꺼낸다
        val point = Q.poll()
        //목적지 인가? -> 없음

        //연결된 곳 순회
        for (i in 0 until 4){
            val nextY = point.y + MY[i]
            val nextX = point.x + MX[i]
            //갈 수 있는가? -> 지도 안인가? + 1인가? + 처음 밞은 땅인가?
            if (isInMap(nextY, nextX) && (map[nextY][nextX] == 1)){
                //체크인
                map[nextY][nextX] = 0
                count++
                //간다.
                Q.add(Point(nextY,nextX))
            }
        }
    }
    countList.add(count)
    count = 0
    danji++
}

private fun isInMap(y :Int, x :Int) :Boolean{
    return (y in 0 until N) && (x in 0 until N)
}

data class Point(
    val y :Int,
    val x :Int,
)

 


소스코드(DFS)

import java.io.BufferedReader
import java.io.FileInputStream
import java.io.InputStreamReader

private val MY = arrayOf(0,0,1,-1) //좌 ,우 ,위 ,아래
private val MX = arrayOf(-1,1,0,0) //좌 ,우 ,위 ,아래
private var N = 0   //정사각형 크기 (5이상 25이하)
private lateinit var map : MutableList<MutableList<Int>>

private var count = 0
private var danji = 0
private var countList = mutableListOf <Int>()

private fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    N = br.readLine().toInt()
    map = MutableList(N){br.readLine().map { it.digitToInt() }.toMutableList()}

    for (i in map.indices){
        for (j in map[i].indices){
            //처음 방문하는 단지 찾으면 DFS 돌려~
            if ((map[i][j] == 1)){
                count++
                dfs(i, j)
                countList.add(count)
                count = 0
                danji++
            }
        }
    }
    println(danji)
    countList.sorted().forEach { println(it) }
}

private fun dfs(
    y :Int,
    x :Int
){
    //체크인
    map[y][x] = 0
    //목적지 인가? -> 없음

    //연결된 곳 순회
    for (i in 0 until 4){
        val nextY = y + MY[i]
        val nextX = x + MX[i]
        //갈 수 있는가? -> 지도 안인가? + 1인가? + 처음 밞은 땅인가?
        if (isInMap(nextY, nextX) && (map[nextY][nextX] == 1)){
            //간다.
            count++
            dfs(nextY,nextX)
        }
    }
    //체크아웃 -> 할 필요가 없음 (한 분기가 연결된 곳의 끝까지가면 다른 분기는 굳이 돌려보지 않아도 됨으로)
}

private fun isInMap(y :Int, x :Int) :Boolean{
    return (y in 0 until N) && (x in 0 until N)
}

'Algorithm_Kotlin' 카테고리의 다른 글

[Kotlin] BOJ10026 적록색약  (0) 2023.01.12
[Kotlin] BOJ2606 바이러스  (0) 2023.01.07
[Kotlin] BOJ7569 토마토  (0) 2023.01.05
[Kotlin] BOJ9663 N-Queen  (0) 2022.08.19
[Kotiln] BOJ1920 수 찾기  (0) 2022.08.17