(코틀린) BOJ14719 빗물

(코틀린) BOJ14719 빗물

협회: https://www.acmicpc.net/problem/14719

14719호: 빗물

첫 번째 줄은 2D 세계의 세로 길이 H와 2D 세계의 너비 W를 제공합니다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 2D 세계에서 가장 왼쪽 위치인 블록의 높이를 나타내는 0과 H 미만의 정수가 있습니다.

www.acmicpc.net


소스 코드(구현)

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이 될 때까지

Similar Posts

  • ●두피땀, 두한증에 어떻게 대처해야 할까?

    ●두피땀, 두한증에 어떻게 대처해야 할까? 요즘처럼 기온이 올라가면 수분을 많이 섭취해서 평소보다 땀을 많이 흘리게 됩니다. 그중에서도 특히 땀을 많이 흘리는 분들 중 뜨거운 음식뿐만 아니라 매운 음식을 먹을 때도 머리에서 땀이 나고 땀이 비오듯 내린다고 많이들 합니다.특히 두피의 땀이 많이 흘러 일상생활에도 불편을 초래하고 상의가 젖어서 고민이 많으신 분들이 많은데 이럴 경우 두한증인지 의심해보시길…

  • 대구시내 모든 대회 및 모집은 시민청원/가족봉사를 통해 진행됩니다.

    대구시민 V. 가족봉사단 홈페이지 “열린 채용” 서비스 기관은 시에서 지역 및 카운티로 확장됩니다. 시, 구, 군의 모든 “공채/모집” 정보를 제공하고 온라인 지원도 가능합니다! 대구시는 2023년 3월부터 시청과 관공서에서만 제공되던 ‘국민청원·가족서비스’와 ‘공채’ 온라인 서비스를 시·군으로 확대·운영한다. (https://minwon.daegu.go.kr) 대구시는 2018년 6월부터 민원인이 온라인으로 각종 허가·등록·신고·민원을 신청·접수하고 각종 공모전 및 채용사업을 온라인으로 추진할 수 있는 ‘시민청원·공공가족서비스’ 종합창구를 개설했다….

  • 임신 중 콜라겐바이너랩 겟글로이 내돈내산

    임신은 여성의 몸에 큰 변화를 가져오는 시점으로, 이 과정에서 피부 건강에 대한 관심이 높아집니다. 최근 많은 임산부들이 피부 탄력과 건강을 위해 콜라겐 제품에 주목하고 있습니다. 그 중에서도 콜라겐바이너랩 겟글로이는 특히 많은 관심을 받고 있는데, 그 이유와 사용 경험을 자세히 알아보겠습니다. 콜라겐바이너랩 겟글로이의 성분과 효능 콜라겐바이너랩 겟글로이는 신뢰할 수 있는 브랜드에서 출시한 제품으로, 임신 중에도 안전하게…

  • 강릉 가볼만한곳 10선 정동진 레일바이크

    드라마 도깨비 촬영지인 경포테라스, 대관령 동물농장, 사천해수욕장, 주문진항 등 강원도 강릉의 인기 명소 5곳을 선정했다. 이 외에도 많은 관광지가 있지만 사람들이 자주 찾는 곳을 5곳을 찾았다. 1. 정동진 레일바이크 출처: 정동진 레일바이크 홈페이지 사용료2인석 25,000원4인승 : 35,000원 사용시간8:45 – 16:45 (3월 – 10월)8:35 – 15:45 (11월 – 2월) 페달을 밟으며 바다를 바라보며 가족이나 연인과 함께…

  • 클래식 피아노 소나타의 진화

    “소나타”단어는 이탈리아어 동사 “소나”(소리)~에서 “음악“같은 뜻.16501998년부터 현재까지 음악의 역사를 관통하는 다양한 형태의 음악 작품들. ‘피아노 소나타‘라고. 좁게 ‘소나타‘이 용어는 고전 소나타의 정의에 적합하며, 하나악장이 소나타 형식인 작품만 수록. 이 형식은 Haydn 이후에만 확립될 수 있었고 베토벤 후기와 보다 최근의 낭만주의 시대에 점점 쓸모없게 되었습니다..19001998년부터 순수명사 또는 작품명 “소나타”나머지 대부분, 이것은 이론적으로 소나타의 정의와 일치하지 않습니다…..

  • 대구이혼전문변호사 불안 잠재울 이혼소송 가압류

    대구이혼전문변호사 불안 잠재울 이혼소송 가압류 이혼은 단순히 남녀가 헤어질 문제가 아닙니다. 법적인 부부가 되어 생활을 함께 한 만큼 정리해야 할 부분이 정말 많습니다. 그 중 특히 민감해지기 쉬운 부분이 바로 ‘재산’과 관련된 사안입니다.부부가 함께 살고 생활 전반을 함께 해왔기 때문에 남편의 재산과 아내의 재산을 칼처럼 나눌 수는 없습니다.당신 것인지 내 것인지 모르는 재산이 꽤 많이…