문제 : www.acmicpc.net/problem/2667
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)
}
}
가장자리 예외처리 하면 너무 복잡해지므로 한칸씩 다 띄어줬다.