문제 : www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
import java.util.*
lateinit var map : Array<IntArray>
var h = 0
var w = 0
fun main() = with(Scanner(System.`in`)){
h = nextInt()
w = nextInt()
var sum = 0
map = Array(w){IntArray(h){0} }
// 오른쪽으로 눕힌 느낌으로
for(i in 0 until w){
val tmp = nextInt()
for(j in 0 until tmp){
map[i][j] = 1
}
}
// 전체 탐색
for(i in 0 until w){
for(j in 0 until h){
// 블럭이 없는 곳일 때
if(map[i][j] == 0){
// 위에가 막혀있나 탐색해봄
if(Up(i-1,j)) {
// 아래가 막혀있나 탐색해봄
if(Down(i+1,j)) sum++
}
}
}
}
println(sum)
}
fun Up(i : Int , j : Int) : Boolean{
if(i >=0){
return if(map[i][j] == 1) true
else Up(i-1,j)
}
return false
}
fun Down(i : Int , j : Int) : Boolean{
if(i < w){
return if(map[i][j] == 1) true
else Down(i+1,j)
}
return false
}
2차원배열을 할당하기 편하게 그림을 오른쪽으로 눕혀서 각 줄의 개수만큼 블럭을 넣어주고,
블럭이 없는 곳에서 위와 아래로 끝까지 탐색하여 둘다 막혀있다면 고인 것이므로 위,아래 방향으로 재귀탐색 해준다.