새소식

PS/백준

[백준/14719] 빗물 (Python)

  • -

Problem : https://www.acmicpc.net/problem/14719

 

14719번: 빗물

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

www.acmicpc.net

 

Difficulty : Gold 5

 

Status : Solved

 

Time : 00:15:16

 


 

문제 설명

 

더보기


2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.


비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?

 

 

입력 및 출력

 

더보기

입력

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.

 

출력

2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.
빗물이 전혀 고이지 않을 경우 0을 출력하여라.

 

 

입력 예시

 

4 4
3 0 1 4

  

출력 예시

 

5

 

 


 

풀이

 

빗물이 고이는 조건은 좌우로 골짜기가 생길 때이다. 우리는 골짜기를 높이가 내림차순으로 이루어지다가 오름차순으로 이루어지는 구간 으로 정의해 볼 수 있겠다. 이 때 골짜기는 양 끝단의 높이 중 최솟값을 기준으로 채워지게 된다.

 

즉 우리는 더 이상의 골짜기가 생기지 않을 때까지 전체 칸을 반복하며 탐색하는 코드를 짜볼 수 있다.

 

 

풀이 코드

import sys
input = sys.stdin.readline

H, W = map(int, input().split())
block_list = list(map(int, input().split()))

def valley_fill(left, right) :
  result = 0
  min_h = min(block_list[left], block_list[right])
  for i in range(left, right+1) :
    if block_list[i] < min_h :
      result += min_h - block_list[i]
      block_list[i] = min_h
  return result

def find_valleys() :
  result = 0
  top = -1
  disc = True
  for i in range(1, W) :
    if block_list[i-1] > block_list[i] :
      top = i-1
      break
  for j in range(i+1, W) :
    if block_list[j-1] > block_list[j] and not disc :
      result += valley_fill(top, j-1)
      top = j-1
      disc = True
    elif block_list[j-1] < block_list[j] and disc :
      disc = False

  if not disc :
    result += valley_fill(top, W-1)
  return result

answer = 0
while True :
  tmp = find_valleys()
  if not tmp :
    break
  answer += tmp

print(answer)

풀이 완료!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.