티스토리 뷰
https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
문제를 처음 봤을 때는 막연하게 2차원 배열을 만들어야 하나? 생각했다. 하지만 조금만 더 생각을 해보면 1차원 배열로도 충분히 풀 수 있다는 것을 알 수 있다.
문제를 접근한 방식은 아래와 같다.
1. 0번째 인덱스의 값을 max_height라는 리스트에 인덱스와 함께 저장한다. (ex. max_height = [0, 3])
2. for 반복문으로 1번째 인덱스부터 접근한다. 이때 max_height와 그 다음 높이를 비교하여 최솟값을 min_value에 저장한다. 위의 그림(i=1)에서 볼 수 있듯이 min_value = 1이 될 것이다.
3. 그리고 max_value의 인덱스부터 i까지 for 반복문을 돌며 min_value보다 낮은 높이에는 빗물을 채운다. answer라는 변수에 min_value - A[i]만큼 더한다. 이 단계에서 i=1의 그림에서 볼 수 있듯이 빗물이 1만큼 고이게 된다. 따라서 A[1] = 1로 업데이트시켜준다. 즉 min_value의 값을 A[i]에 저장한다.
4. 그리고 해당 인덱스(i)가 max_height의 값보다 크거나 같으면 값을 갱신시킨다. 왜냐하면 그 이전 값을 굳이 탐색할 필요가 없기 때문이다.
5. 2-4의 과정을 반복하면 answer에는 고이게 되는 빗물의 총량을 알 수 있다.
# 빗물
import sys
input = sys.stdin.readline
H, W = map(int, input().split())
A = list(map(int, input().split()))
max_height = [0, A[0]]
answer = 0
for i in range(1, W-1):
min_value = min(max_height[1], A[i+1])
for j in range(max_height[0], i+1):
if A[j] < min_value:
answer += min_value - A[j]
A[j] = min_value
if max_height[1] <= A[i]:
max_height = [i, A[i]]
print(answer)
제출한 최종 코드는 위와 같다.
'PS > BOJ Python' 카테고리의 다른 글
1068번 - 트리 (0) | 2023.10.06 |
---|---|
11729번 - 하노이 탑 이동 순서 (0) | 2023.10.04 |
1715번 - 카드 정렬하기 (0) | 2023.07.17 |
17298번 - 오큰수 (0) | 2023.07.14 |
10986번 - 나머지 합 (0) | 2023.07.12 |
- Total
- Today
- Yesterday
- 딕셔너리
- 1182
- 수학
- 17478
- 백준
- 파이썬
- 싸피
- 1715
- 2805
- 덱
- 브루트포스
- dp
- 1358
- 10816
- 1764
- 조합
- 러스트
- 11051
- 1759
- 삼성청년소프트웨어아카데미
- 10971
- 10845
- 빌림
- 백트래킹
- 큐
- 스택
- 10815
- heapq
- 자료구조
- 프로그래머스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |