경험의 기록

문제 : 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차원배열을 할당하기 편하게 그림을 오른쪽으로 눕혀서 각 줄의 개수만큼 블럭을 넣어주고,

블럭이 없는 곳에서 위와 아래로 끝까지 탐색하여 둘다 막혀있다면 고인 것이므로 위,아래 방향으로 재귀탐색 해준다.

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading