인프런 커뮤니티 질문&답변

강토토님의 프로필 이미지
강토토

작성한 질문수

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

2468 안전 영역

해결된 질문

작성

·

230

0

안녕하세요 이제 막 알고리즘 시작한 코린이 입니다. 큰돌님 처음으로 질문 드려봅니다!!
dfs 문제에서 어디서 오류가 났는지를 못찾겠어서 도움 요청드려요..
그리고 꼭 여쭤보고 싶은게 ny랑 nx 또는 y와 x의 순서는 x y 가 아니라 왜 항상 y부터 먼저 사용하는 건가요?
그 부분이 조금 헷갈려서 여쭙고 싶어요 선생님.
 
#include <bits/stdc++.h>
using namespace std;
const int max_n = 104;
int n, ret, a[max_n][max_n], e[max_n][max_n], h = 1;
bool visited[max_n][max_n];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};

void dfs(int y, int x) {
    visited[y][x] = 1;
    for (int i=0; i<4; ++i) {
        int ny = y + dy[i];
        int nx = x + dx[i];
        if (ny < 0 || ny >= n || nx < 0 || nx >= n) continue;
        if (e[ny][nx] == 0 && !visited[ny][nx]) dfs(ny, nx);
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
    
    cin >> n;
    for (int i=0; i<n; ++i) {
        for (int j=0; j<n; ++j) {
            cin >> a[i][j];
        }
    }
    
    while (h <= 100) {
        fill(&visited[0][0], &visited[0][0] + max_n * max_n, 0);
        int temp = 0;
        for (int i=0; i<n; ++i) {
            for (int j=0; j<n; ++j) {
                if (e[i][j] == 1) continue;
                if (a[i][j] <= h) e[i][j] = 1;
            }
        }
        
        for (int i=0; i<n; ++i) {
            for (int j=0; j<n; ++j) {
                if (e[i][j] == 0 && !visited[i][j]) {
                    dfs(i, j);
                    ++temp;
                }
            }
        }
        ret = max(ret, temp);
        ++h;
    }
    
    cout << ret << "\n";
    
    return 0;
}

답변 2

1

큰돌님의 프로필 이미지
큰돌
지식공유자

그거 취향이에요. 근데 저는 y, x 이 순을 추천드려요. x, y로 해도 되지만... 저는 그래요. ㅋㅋ 

0

강토토님의 프로필 이미지
강토토
질문자

코드에서 문제를 못찾다가 찾았는데

이맞왜틀?? 이었거든요.  초기화 부분에서 ret = 1으로 지정해주니까 해결됬네요.

ret = max(ret, temp); 로 ret 값을 갱신할 때 처음 ret가 초기화가 안되어 있어서 문제가 생긴 것 같아요.

큰돌님의 프로필 이미지
큰돌
지식공유자

아 이거 틀린것도 물어보셨구나.. ㅎㅎ 저는 y, x만 물어보신 줄 알고 답변드렸는데 ㅎㅎ 담에 또 질문있으시면 질문주세요!

강토토님의 프로필 이미지
강토토
질문자

감사합니다!!

강토토님의 프로필 이미지
강토토

작성한 질문수

질문하기