C++/코드트리 챌린지

[코드트리 챌린지] 2주차 BFS - BFS 탐색 / 갈 수 있는 곳들

tmd1 2023. 9. 18. 19:59

 

https://www.codetree.ai/missions/2/problems/places-can-go/description

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

코드:

#include <bits/stdc++.h>
using namespace std;

int n, k;
int arr[105][105]; // 영역 저장
bool visited[105][105]; // 방문 확인
queue <pair<int, int>> q; // BFS용 큐
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
int cnt;

bool InRange(int nx, int ny) {
    return (0 <= nx && nx < n && 0 <= ny && ny < n);
}

bool Cango(int nx, int ny) {
    if (!InRange(nx, ny)) return false;
    if (arr[nx][ny] == 1) return false;
    if (visited[nx][ny]) return false;

    return true;
}

void BFS() {
    // 큐에서 차례대로 빼내어 인접한 부분을 다시 큐에 넣음
    // 큐가 빌 때 까지 반복한다.
    while (!q.empty()) {
        pair<int, int> p = q.front();
        q.pop();

        int x = p.first;
        int y = p.second;
        for (int dirNum = 0; dirNum < 4; dirNum++) {
            int nx = x + dx[dirNum];
            int ny = y + dy[dirNum];

            if (Cango(nx, ny)) {
                visited[nx][ny] = true;
                q.push(make_pair(nx,ny));
            }
        }
    }
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> arr[i][j];
        }
    }

    int x, y;
    for (int i = 0; i < k; i++) {
        cin >> x >> y;
        if (Cango(x-1, y-1)) {
            visited[x - 1][y - 1] = true;
            q.push(make_pair(x - 1, y - 1));
            BFS();
        }
    }
    
    cout << cnt;
}
기존과 BFS 진행 자체는 동일합니다.

x,y를 입력 받을 때 마다 이 위치가 갈 수 있는 곳인지, 이미 방문한 곳인지 꼭 체크합니다.

Cango()가 true라면 visited를 true로 만들고 pair를 만들어 큐에 삽입시킨 후 BFS를 실행합니다.

입력받은 곳을 모두 큐에 넣고 이후에 BFS를 하지 않는 이유는 먼저 입력받은 위치에 의해
나중에 입력받은 위치가 이미 방문한 곳일 경우 cnt가 중복으로 올라갈 수 있기 때문입니다.