본문 바로가기

백준/골드

[백준 8982번] 수족관 1 (C++)

문제링크 : https://www.acmicpc.net/problem/8982

 

8982번: 수족관 1

입력의 첫 줄은 수족관의 경계에 있는 꼭짓점의 개수 N(1 ≤ N ≤ 5,000)이 주어진다. N은 짝수이다. 수족관의 경계는 항상 꼭짓점 (0, 0)부터 시작한다. 그리고 마지막 꼭짓점은 (A, 0)의 형태로 끝난

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>

pii depth[400001]; //각 최대 깊이와 빠져나간 깊이

int main()
{
    int N, M, result = 0;
    cin >> N;

    int x1, y1, x2, y2;
    cin >> x1 >> y1; //0, 0 (시작점)
    for(int i=0; i<N/2-1; i++)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        for(int j=x1; j<x2; j++)
        {
            depth[j].first = y1; //해당 위치에 따른 깊이 저장
        }
    }
    cin >> x1 >> y1; //x, 0 (끝점)
    
    int width = x1; //가로길이 저장

    vector<int> hole; //구멍 갯수 담기

    cin >> M;
    for(int i=0; i<M; i++)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        hole.push_back(x1); //구멍 위치
    }

    for(int i=0; i<hole.size(); i++)
    {
        int d = depth[hole[i]].first; //현재 구멍의 깊이
        depth[hole[i]].second = d;

        for(int j=hole[i]-1; j>=0; j--) //구멍의 왼쪽
        {
            d = min(d, depth[j].first); //이 이상으로 못 깊어짐 (표면)
            depth[j].second = max(depth[j].second, d); //뺄수 있는 최대 깊이 
        }
        d = depth[hole[i]].first;

        for(int k=hole[i]+1; k<width; k++) //구멍의 오른쪽
        {
            d = min(d, depth[k].first); //이 이상으로 못 깊어짐 (표면)
            depth[k].second = max(depth[k].second, d); //뺄수 있는 최대 깊이 
        }

    }

    for(int i=0; i<width; i++)
    {
        result += (depth[i].first - depth[i].second); //최대 깊이 - 빠져나간 깊이
    }

    cout << result;
}

구멍을 기준으로 좌우를 탐색해준다.

기존에 해당 x좌표에 따른 깊이를 저장해준 것을 이용하여 현재 구멍의 깊이와 구멍의 왼쪽에 있는 깊이, 구멍의 오른쪽에 있는 깊이를 각각 비교하여 뺄 수 있는 최대 깊이를 구해준다.

 

아직 골드3 문제도 온전히 나만의 힘으로 풀기는 버거운 것 같다.

어느정도 아이디어는 잡을 수 있지만, 아직 구현이 부족한 것 같다.

'백준 > 골드' 카테고리의 다른 글

[백준 7894번] 큰 수 (C++)  (0) 2023.05.11
[백준 5569번] 출근 경로 (C++)  (0) 2023.05.10
[백준 15684번] 사다리 조작 (C++)  (0) 2023.05.06
[백준 2668번] 숫자고르기 (C++)  (0) 2023.05.03
[백준 2170번] 선 긋기 (C++)  (0) 2023.05.01