inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

2-C

[2468번] segmentation fault

195

euijae.lee0714

작성한 질문수 4

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 때문인 거 같은데 한 번 더 확인 해보겠습니다.

 

 

c++ 코딩-테스트

답변 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점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


0

euijae.lee0714

정말 감사드립니다!

코딩살구클럽 입장이 안됩니다

0

37

2

4-F 경우의 수 질문입니다.

0

27

2

코딩살구클럽 가입이 안됩니다.

0

57

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

47

1

교안 158페이지 문의드립니다

0

41

2

코딩살구클럽 관련 건의사항

0

102

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

41

1

진행 방법 질문드립니다!

0

75

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

61

2

2주차 개념#12 트리 순회

0

32

2

백준사이트가 종료된다고 합니다.

0

307

2

백준 서비스 종료

9

928

1

sk 하이닉스 코테 대비

0

380

2

3-G 최댓값 질문

0

52

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

63

2

3-N 질문 있습니다.

0

68

2

학습방법

0

104

2

4-H 질문 있습니다 (코드 리뷰)

0

67

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

178

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

70

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

65

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

52

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

70

2