인프런 커뮤니티 질문&답변
작성자 없음
작성자 정보가 삭제된 글입니다.
2636 if문 질문입니다
작성
·
517
·
수정됨
0
정말 사소한 질문일 수도 있는데요
2636번 치즈 문제에서 dfs(go함수)를 들어갔을때 치즈면(1이면) return해서 dfs(go함수)가 종료되잖아요? 그럼 다시 dfs(go함수)에 들어가려면 cnt가 올라야 하는데 디버깅을 해보면 cnt는 왜 123 최대치가 3까지밖에 안오를까요??!?? 제가 어디서 헤메고 있을까요?!?? ㅜㅜㅜ
답변 4
0
정답코드를 보고 왜 이렇게 짜야지 정답일까를 보고 있었는데 (처음 의문) if문에서 return이 되면 go함수가 종료되는것으로 이해하고 있는데 그럼 다시 go함수를 어떻게 반복하지? >> while문이 반복되는건가? >> cnt가 근데 왜 최대 3번까지만 돌아가지? >> 여기서 약간 멘붕이 와서 질문했다가 >> for문에서는 상하좌우 4번을 돌리고 if문에서 return되는것은 상하좌우중 한가지만 리턴이고 다시 go함수(dfs)가 작동되는건가 해서 질문남겼습니다!! ㅜㅜ
음.. 근데 이거는 디버깅하면서 출력해보면 알 수 있는건데요. 제가 재밌게 디버깅코드를 추가해봤어요. 참고부탁드립니다.
#include <bits/stdc++.h>
using namespace std; 
int a[104][104], visited[104][104];
const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, 1, 0, -1};
int n, m, cnt, cnt2;
vector<pair<int, int>> v;
void go(int y, int x){
    visited[y][x] = 1;
    if(a[y][x] == 1){
        v.push_back({y, x});
        return;
    }
    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 >= m || visited[ny][nx]) continue; 
        go(ny,nx);
    }
    return;
}
int main(){
    cin >> n >> m;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cin >> a[i][j];
        }
    }
    while(true){
    	cout << "WHILE문작동\n";
        cnt2 = 0;
        fill(&visited[0][0], &visited[0][0] + 104 * 104, 0);
        v.clear(); 
        go(0, 0);
    	cout << "gogo : " << v.size() << "\n";
        for(pair<int, int> b : v){
            cnt2++;
            a[b.first][b.second] = 0;
        }
        bool flag = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(a[i][j] != 0) flag = 1;
            }
        }
    	cout << "히익 flag : " << flag << "\n";
        cnt++;
    	cout << "cnt : " << cnt << "\n";
        if(!flag) break;
    }
    cout << cnt << '\n' << cnt2 << '\n';
    return 0;
}
/*
WHILE문작동
gogo : 31
히익 flag : 1
cnt : 1
WHILE문작동
gogo : 22
히익 flag : 1
cnt : 2
WHILE문작동
gogo : 5
히익 flag : 0
cnt : 3
3
5
*/0
go 함수가 실행되면 (y,x)좌표가 4방향으로 탐색할때, 상, 우, 하, 좌 를 탐색하는데 예를 들어 상을 탐색할 때는 1이 아니라 go(ny,nx)형태로 넣는다고 하고, 우를 탐색할때 1이면 '녹일 치즈의 위치'를 가지는 v에 넣어주고 리턴합니다. 그럼 상, 우,는 끝났고 아직 하, 좌 가 남았으니 계속 실행합니다.
저도 배우는 입장이라 틀렸을 수도 있지만 제가 이해한 논리는 그렇습니다!
0
0







https://www.acmicpc.net/source/53830318
여기있습니당!!