Algorithm/Baekjoon

[Python] 14719. 빗물

느낌표 공장장 2022. 1. 1. 21:22
h, w = map(int, input().split())    # 세로 길이 h, 가로 길이 w
blocks_h = list(map(int, input().split()))  # 블록의 높이들

l = 0   # 왼쪽 포인터
r = w-1 # 오른쪽 포인터

max_l = max_r = 0   # 왼쪽, 오른쪽의 각 블록의 최대 높이를 저장할 변수
rainwater = 0   # 고이는 빗물의 총량
while l < r:
    # 각 블록의 최대 높이 갱신
    max_l = max(max_l, blocks_h[l])
    max_r = max(max_r, blocks_h[r])

    if max_l < max_r:   # 오른쪽 블럭이 더 큰 경우
        rainwater += max_l - blocks_h[l]    # 왼쪽 블럭을 기준으로 빗물 계산 
        l += 1
    else:               # 왼쪽 블럭이 더 큰 경우 
        rainwater += max_r - blocks_h[r]    # 오른쪽 블럭을 기준으로 빗물 계산 
        r -= 1

print(rainwater)

처음에 for문을 활용하여 큰 블록을 만나면 왼쪽에서 큰 블록, 현재까지 중, 큰 오른쪽 블록을 갱신해주면서 빗물을 계산하는 방식으로 코드를 짰는데,
반례가 계속해서 나와서 코드가 복잡해졌다. 
그래서 '양쪽 기둥을 계속해서 갱신해야 한다'는 힌트(?) 를 얻고, 투포인터 방식으로 해결했더니 간단했다 ! 

'Algorithm > Baekjoon' 카테고리의 다른 글

[Python] 2098. 외판원 순회  (0) 2022.01.12
[Python] 1311. 할 일 정하기 1  (0) 2022.01.12
[Python] 2346. 풍선 터뜨리기  (0) 2022.01.01
[Python] 9252. LCS2  (0) 2022.01.01
[Python] 11723. 집합  (0) 2022.01.01