경험의 기록

문제 : www.acmicpc.net/problem/2667

 

2667번: 단지번호붙이기

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

www.acmicpc.net

 

 

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

lateinit var visit : Array<Array<Int>> // 방문 여부
lateinit var arr : Array<Array<Int>> // 지도
var result = arrayListOf<Int>()
var sum = 0

fun main() = with(BufferedReader(InputStreamReader(System.`in`))){
    var n = readLine().toInt()

    // n*n 배열을 n+2 * n+2 배열로 하여 가장자리에서 하나씩 띄어줌
    arr = Array(n+2){Array<Int>(n+2){0} }
    visit = Array(n+2){Array<Int>(n+2){0} }

    // 줄 마다 입력 받은 것 하나하나씩 배열에 입력
    for(i in 1 .. n){
        readLine().forEachIndexed { index, c -> arr[i][index+1] = c-'0' }
    }

    for(i in 1 .. n){
        for(j in 1 .. n){
            if(arr[i][j] == 1 && visit[i][j] == 0){
                // 반복문이 한번 돌때마다 단지 생성되므로 result에 추가
                find(i,j)
                result.add(sum)
                sum = 0
            }
        }
    }

    println(result.size) // 단지 갯수
    result.sort() // 오름차순
    result.forEach { i -> println(i) }
}

fun find(x : Int, y : Int){
    visit[x][y] = 1 // 탐색 처리
    sum++ // 탐색 횟수

    // 상하좌우 탐색
    if(arr[x+1][y] == 1 && visit[x+1][y] == 0){
        find(x+1,y)
    }
    if(arr[x][y+1] == 1 && visit[x][y+1] == 0){
        find(x,y+1)
    }
    if(arr[x-1][y] == 1 && visit[x-1][y] == 0){
        find(x-1,y)
    }
    if(arr[x][y-1] == 1 && visit[x][y-1] == 0){
        find(x,y-1)
    }

}

 

가장자리 예외처리 하면 너무 복잡해지므로 한칸씩 다 띄어줬다.

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading