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 |