티스토리 뷰
문제
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
풀이
1. 어떤 칸에 빗물이 채워지는 조건에 대해서 생각해볼 때, 그 칸을 제외한 (좌측의 최대 높이, 우측의 최대 높이) 둘 중 작은 높이에서 어떤 칸의 높이를 뺀 만큼 채워진다는 걸 알 수 있습니다. (물론 물이 채워져야 하므로 좌측의 최대 높이, 우측의 최대 높이는 어떤 칸의 높이보다 높아야 합니다.)
2. i칸을 제외한 i칸 좌측의 최대 높이를 $pre[i]$, 우측의 최대높이를 $suf[i]$라고 할 때, 그 의미대로 아래와 같이 표현할 수 있습니다.
$pre[i] = max(pre[i - 1], v[i - 1]) (단, 1<= i < w - 1)$
$suf[i] = max(suf[i + 1], v[i + 1]) (단, 1 <= i < w - 1)$
코드
#include <bits/stdc++.h>
using namespace std;
int h, w, ans;
vector<int> v, pre, suf;
int main() {
cin.tie(NULL); cout.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> h >> w;
v.resize(w), pre.resize(w), suf.resize(w);
for (int i = 0; i < w; i++) cin >> v[i];
pre[0] = v[0];
for (int i = 1; i < w - 1; i++)
pre[i] = max(pre[i - 1], v[i - 1]);
suf[w - 1] = v[w - 1];
for (int i = w - 2; i >= 1; i--)
suf[i] = max(suf[i + 1], v[i + 1]);
for (int i = 1; i < w - 1; i++)
if (pre[i] > v[i] && suf[i] > v[i])
ans += min(pre[i], suf[i]) - v[i];
cout << ans;
}
'Algorithm > BOJ' 카테고리의 다른 글
[백준 20165] 인내의 도미노 장인 호석 (0) | 2020.11.30 |
---|---|
[백준 20164] 홀수 홀릭 호석 (0) | 2020.11.30 |
[백준 20055] 컨베이어 벨트 위의 로봇 (0) | 2020.10.27 |
[백준 2887] 행성터널 (0) | 2020.10.10 |
[백준 12107] 약수 지우기 게임 1 (0) | 2020.10.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 파싱
- 카카오 2차코딩테스트
- 2021 카카오 블라인드
- 게임이론
- 누적합
- 백준
- 투포인터
- 2022 카카오블라인드
- 트리
- 이분탐색
- DP
- 유니온파인드
- Kakaoblind
- 프로그래머스
- 시뮬레이션
- 2020 KAKAO BLIND RECRUITMENT
- 위클리 챌린지
- 2022 카카오 블라인드 코딩테스트
- 카카오 2021
- 동적계획법
- 카카오 표 편집
- 프로그래머스 위클리 9주차
- 2021 KAKAO BLIND
- 표 편집
- 구현
- 프로그래머스 월간코드챌린지
- 2022 KAKAO BLIND RECRUITMENT
- BFS
- 카카오 인턴십
- 카카오 2020 인턴십
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함