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;
}

 

 

링크

https://www.acmicpc.net/problem/14719