백준 14719번 파이썬

정재혁·2022년 7월 26일
0

백준 14719번 빗물

문제


입력 및 출력값


힌트:


풀이:

해당 문제는 블럭의 높이가 주어졌을 때 블럭 사이사이에 빗물이 얼마나 고이는지 확인하는 문제다.
처음 접근할 때는 while문을 활용하고, start를 설정하고 ans_lst를 start를 기준으로 lst[start]값보다 같거난 큰 값이 들어오면 반복문을 탈출해 고인 물의 양을 더해주고 ans_lst를 초기화 후, i+1 을 start에 대입하는 방식으로 문제를 풀었다.

틀린 코드:

h, w = map(int, input().split())

lst = list(map(int, input().split()))

ans = 0
start = 0
ans_lst = []
i = 0
while i < len(lst):
    while i < len(lst):
        if i == start:
            ans_lst.append(lst[i])
        elif lst[i] < lst[start]:
            ans_lst.append(lst[i])
        elif lst[i] >= lst[start]:
            ans_lst.append(lst[i])
            start = i
            break
        i += 1

    ans_lst.sort()
    for j in range(len(ans_lst)-2):
        ans += ans_lst[-2] - ans_lst[j]

    ans_lst.clear()
print(ans)

결과는 당연히 틀렸다..
그래서 다른 방법으로 접근했는데 즉 자신보다 왼쪽에 큰 값과, 오른쪽에 가장 큰값을 가져와 자신과 비교해 두 max 값이 자신보다 크다면 둘 중 작은 값에서 lst[i] 값을 빼주고 이를 ans에 더해주는 형태로 문제를 풀었다.


수정 코드:

h, w = map(int, input().split())

lst = list(map(int, input().split()))

ans = 0
for i in range(1,w-1):
    lmax = max(lst[:i])
    rmax = max(lst[i+1:])

    if lmax > lst[i] and rmax > lst[i]:
        ans += min(lmax, rmax) - lst[i]

print(ans)

profile
저는 정재혁임니다^___^

0개의 댓글