fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 33900 (C++) 캠핑장 부지 평탄화
최초 업로드: 2025-09-30 07:27:55
최근 수정 시간: 2025-09-30 07:28:10
게시자: rlatjwls3333
카테고리: 백준
조회수: 4
# [Silver IV] 캠핑장 부지 평탄화 [문제 링크](https://www.acmicpc.net/problem/33900) ## 문제 설명 <p>(주)영일건설은 정적산 일대의 아름다운 경관을 널리 알리고자, 이 지역에 $R \times C$ 크기의 부지를 선정하여 캠핑장을 조성할 계획이다.</p> <p>캠핑장을 짓기 위해서는, 지반을 고르게 다지는 기초 평탄화 작업이 필요하며, 이를 위해 사전에 정의된 작업 계획도를 활용한다.</p> <p>작업 계획도는 $R \times C$ 크기의 격자판으로, 각 칸에는 해당 위치에서 얼마만큼 고도를 줄여야 하는지가 기록되어 있다. 즉, 작업 계획도는 캠핑장 부지를 평평하게 만들기 위한 설계도로, 모든 지점의 고도를 줄이는 방향으로만 작업이 이루어진다.</p> <p>정적산 일대의 지형은 $N \times M$ 크기의 지도로 주어지며, 이는 각 지점의 해발 고도를 담은 격자 형태의 데이터다.</p> <p>이 지도에서 작업 계획도의 크기와 같은 $R \times C$ 크기의 격자 영역을 선택하여, 작업 계획도와 정확히 겹치도록 한 후, 각 지점에 대해 지도에 적힌 고도에서 작업 계획도에 적힌 값을 빼보았을 때, 해당 격자 영역 내 모든 지점의 고도가 동일해진다면 해당 위치는 평탄화가 가능한 부지로 판단한다. 단, 작업 계획도는 회전하거나 변형할 수 없으며, 주어진 형태 그대로 적용해야 한다. 음수의 고도로도 평탄화가 가능함에 유의한다.</p> <p>캠핑장 부지는 아직 확정되지 않았기 때문에, 먼저 평탄화가 가능한 후보 부지들을 지도에서 탐색해야 한다.</p> <p>주어진 지도와 작업 계획도를 바탕으로, 평탄화가 가능한 $R \times C$ 크기의 부지가 총 몇 곳인지 확인해 보자.</p> ## 입력 <p>첫 번째 줄에 지도의 행의 개수와 열의 개수를 나타내는 두 정수 $N$, $M$ 그리고 작업 계획도의 행의 개수와 열의 개수를 나타내는 $R$, $C$가 공백으로 구분되어 주어진다. $(1 \leq N, M \leq 1\,000;$ $1 \leq R \leq \min(9, N);$ $1 \leq C \leq \min(9, M);$ $1 \leq R \times C \leq 9)$</p> <p>두 번째 줄부터 $N$개의 줄에 걸쳐 지도의 고도 정보가 주어진다. 각 줄은 한 행에 해당하며, $M$개의 정수가 공백으로 구분되어 주어진다. 이 정수들은 해당 행의 첫 번째 열부터 $M$번째 열까지의 해발 고도를 의미하며, $1$ 이상 $9$ 이하의 정수이다.</p> <p>그다음 줄부터 $R$개의 줄에 걸쳐 작업 계획도 정보가 주어진다. 각 줄은 한 행에 해당하며, $C$개의 정수가 공백으로 구분되어 주어진다. 이 정수들은 해당 행의 첫 번째 열부터 $C$번째 열까지의 줄여야 하는 고도를 의미하며, $0$ 이상 $9$ 이하의 정수이다.</p> ## 출력 <p>평탄화 가능한 후보지 최대 개수를 출력한다.</p> ## 풀이 N x M 이차원 공간에서 R x C 이차원 공간의 값을 뺏을 때, 모두 같은지 4중 반복문으로 확인하는 브루트포스 문제입니다. ``` c++ #include<bits/stdc++.h> using namespace std; int n, m, r, c; int board[1000][1000], plan[10][10]; bool chk(int a, int b) { set<int> vals; for(int i=0;i<r;i++) for(int j=0;j<c;j++) vals.insert(board[a+i][b+j]-plan[i][j]); return vals.size()==1; } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> r >> c; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin >> board[i][j]; for(int i=0;i<r;i++) for(int j=0;j<c;j++) cin >> plan[i][j]; int cnt=0; for(int i=0;i<n-r+1;i++) for(int j=0;j<m-c+1;j++) cnt += chk(i, j); cout << cnt; } ```