작성
·
153
·
수정됨
0
// Online C++ compiler to run C++ program online
#include <bits/stdc++.h>
using namespace std;
// 많은 비가 내렸을 때 물에 잠기지 않는 안전한 영역이 최대로 몇 개가 만들어 지는 지를 조사하려고 한다. 이때, 문제를 간단하게 하기 위하여, 장마철에 내리는 비의 양에 따라 일정한 높이 이하의 모든 지점은 물에 잠긴다고 가정한다.
// 어떤 지역의 높이 정보가 주어졌을 때, 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 계산하는 프로그램을 작성하시오.
////입력 :
// 1. 첫째 줄에는 어떤 지역을 나타내는 2차원 배열의 행과 열의 개수를 나타내는 수 N (N은 2 이상 100 이하의 정수)
// 2. 둘째 줄부터 N개의 각 줄에는 2차원 배열의 첫 번째 행부터 N번째 행까지 순서대로 한 행씩 높이 정보가 입력된다.
// 3. 높이는 1이상 100 이하의 정수이다.
////출력 :
//첫째 줄에 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 출력한다.
int n;
int arr[100][100];
int visited[100][100];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
priority_queue<int> safeAreas;
void dfs(int y, int x, int height){
//방문처리
visited[y][x] = true;
//4방향 탐색
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
//탐색 x 조건
if( y < 0 || x < 0 || y >= n || x >= n ) continue; // out of bound
if( visited[ny][nx] ) continue;
if( arr[ny][nx] <= height ) continue; //물에 잠긴 지역
// 방문
dfs(ny,nx,height);
}
}
// find connected graphs
int getSafeAreaCnt(int height){
memset(visited, 0, sizeof(visited));
int connected = 0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(!visited[j][i] && arr[j][i] > height ){// 방문하지 않았고, safe area
dfs(j,i, height);
connected++;
}
}
}
return connected;
}
int main() {
//입력
cin >> n;
string input;
int maxHeight=0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cin >> arr[j][i];
maxHeight = max( maxHeight , arr[j][i] ); // 1. 높이의 max 값을 구한다.
}
}
for(int height=0; height <= maxHeight; height++){
safeAreas.push( getSafeAreaCnt( height ) );
}
cout << safeAreas.top() << '\n';
}
https://www.acmicpc.net/problem/2468
안녕하세요 큰돌님. segmentation fault 나는데 어디서 나는지 잘 모르겠습니다 ㅠ
priority queue 때문인 거 같은데 한 번 더 확인 해보겠습니다.
답변 1
0
안녕하세요 ㅎㅎ
해당 PQ에 값이 들어가있지 않을때를 고려해서 로직을 구축해주셔야 합니다.
항상 top()이 들어갈 때는 size()체크해서 하시는게 좋습니다.
if(safeAreas.size()){
cout << safeAreas.top() << "\n";
}else cout << 1 << "\n";
이렇게 바꿔보시겠어요? (이렇게 하면 통과뜹니다.)
초기값 : 1 관련해서는
강의 : 2 - c보완설명 참고부탁드립니다.
또한, 배열은 좀 더 크게 잡는게 좋습니다.
int arr[104][104];
int visited[104][104];
해당 부분은 교안내의 다음 부분 참고부탁드립니다.
배열의 경우 조금 더 넓게
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
정말 감사드립니다!