링크 : https://www.acmicpc.net/problem/14719

 

14719번: 빗물

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치

www.acmicpc.net

소스코드(Implement)

import java.io.BufferedReader
import java.io.FileInputStream
import java.io.InputStreamReader
import kotlin.math.abs

//(1 ≤ H, W ≤ 500)
private var H = 0 //세로
private var W = 0 //가로
private var answer = 0
private lateinit var map :List<Int>
private lateinit var isVisited :BooleanArray
private fun main(){
    val br = BufferedReader(InputStreamReader(System.`in`))
    br.readLine().split(" ").map { it.toInt() }.apply {
        H = this[0]
        W = this[1]
    }
    //0이상 H이하의 정수 W개 (블록이 쌓인 높이를 의미하는 수 주어짐)
    map = br.readLine().split(" ").map { it.toInt() }
    isVisited = BooleanArray(W) { false }

    for (i in H downTo 1){
        val indexList = mutableListOf<Int>()
        for (k in map.indices){
            if (map[k] >= i){
                indexList.add(k)
            }
        }
        getWaterSpace(indexList, i)
    }

    println(answer)
}

private fun getWaterSpace(indexList :List<Int>, targetH :Int){
    if (indexList.size <= 1) return
    var p1 = indexList[0]
    var p2 = indexList[1]
    //두개의 인덱스 사이에 있는 애들 전부 Visited 처리 (기둥의 인덱스는 포함하지 않음)
    for (i in 2..indexList.size){
        if (abs(p2-p1) != 1){
            for(k in minOf(p1,p2)+1 ..maxOf(p1,p2)-1){
                if (!isVisited[k]){
                    answer += targetH - map[k]
                    isVisited[k] = true
                }
            }
        }
        //두개의 포인터중 숫자가 작은 포인터가 값 바뀜
        if (i > indexList.lastIndex) break
        if (p1 > p2) p2 = indexList[i] else p1 = indexList[i]
    }
}

 

 

풀이 방법 :

맨위에서부터 해당 기둥 값으로 물웅덩이를 만들 수 있는지 탐색한다.

만약 높이가 4인 기둥이 두 개가 있으면 두 개의 기둥사이에 각 칸마다

(4 - 그 기둥 사이에 있는 기둥의 높이)의 높이를 가지는 물이가 생긴다.
물 웅덩이를 만들었으면 isVisited 체크 해주고 해당 체크가 안된 구역을 다시 검사한다.

높이가 1이 될 때 까지

'Algorithm_Kotlin' 카테고리의 다른 글

[Kotlin] BOJ1913 달팽이  (0) 2023.03.09
[Kotlin] BOJ1063 킹  (1) 2023.03.06
[Kotlin] BOJ1553 도미노 찾기  (0) 2023.02.25
[Kotlin] BOJ11562 백양로 브레이크  (0) 2023.02.15
[Kotlin] BOJ2665 미로만들기  (0) 2023.02.03