Baekjoon(C++)/시뮬레이션
[BOJ - 14719] 빗물(C++)
alswns8081
2025. 4. 10. 15:59
- 문제를 읽고 처음 생각했던 방법은
- dx[2] = {0, 0}; dy[2] = {-1, 1}, 을 놔두고 움직이면서 양 옆으로 감싸진 벽이 있다는 해당 칸은 물이 고이는 영역으로 구현하는게 좋지 않을까.
- 위 방법으로 구현 방법을 고민하니 반복문을 통해 2차원 배열을 정의하면 간단하게 구현이 가능할 것 같다고 판단
- 예시를 토대로 보자
- (4, 4)에 3, 0, 1, 4로 주어졌을 때 빈 공간은 0, 벽이 설치된 공간은 1이라고 정의하자.
- 2차원 배열의 모든 경우를 순차적으로 탐색 물이 고이기 위해서는 양 옆으로 벽이 설치되어 있어야 한다
- boolean 변수를 하나 정의해 탐색을 하던 도중 벽이 있다면 boolean 변수의 값을 true로 변경하고 계속 작업을 한다
- 빈 공간을 만난다면 count 변수를 1 증가
- 만일 true인 상태에서 벽을 만난다면, 결과값에 count 변수를 증가시키면서 count 변수를 초기화
뭔가 내 방식 말고도 다른 방법으로도 구현할 수 있을거 같아서 지교수님한테 어떻게 풀 건지 물어봄.
지금 읽어봤는데 뭔 소리인지 모르겠음,, 그냥 제가 푼 방식으로 풀래요. 네.
코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int H, W;
cin >> H >> W;
vector<int> height(W);
for (int i = 0; i < W; i++) cin >> height[i];
vector<vector<int>> grid(H, vector<int>(W, 0));
for (int I = 0; I < W; I++) {
int cur_height = height[I];
for (int II = H-1; II >= (H - cur_height); II--)
grid[II][I] = 1;
}
int result = 0;
for (int I = 0; I < H; I++) {
bool k = false;
int cnt = 0;
for (int II = 0; II < W; II++) {
if (k == false) {
if (grid[I][II] == 1) k = true;
} else {
if (grid[I][II] == 0) cnt++;
else {
result+= cnt;
cnt = 0;
}
}
}
}
cout << result;
return 0;
}