강의

멘토링

로드맵

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

이호준님의 프로필 이미지
이호준

작성한 질문수

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

2-Q

2-Q 질문있습니다

작성

·

11

0

안녕하세요 큰돌님 문제를 풀다가 이해안되는 부분이 있어 질문드립니다.
https://www.acmicpc.net/source/98984224
Q1. 저는 dfs 부분에서 0일때 1일때 다르게 처리 했는데요 1만나면 방문처리, 벡터에 담고, 더이상 탐색을 안하는데 왜 쌤이 구현한 방식이랑 치즈개수에서 차이가 나는지 궁금합니다.
주석처리한 부분이 쌤이 구현하신 코드입니다.

 

Q2. 이런 동시 확산문제에서는 dfs(), bfs()에 좌표뿐만 아니라 동 시간대라는 정보를 주기 위해
시간 정보도 같이 인자로 넣어서 풀어도 될까요? bfs(int y, int x, int t)

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

이호준님께서 치즈 문제를 푸시면서 DFS를 활용해 특정 조건에서 다르게 처리하고 계시군요. 관련하여 질문 주신 내용에 대해 답변 드릴게요.

Q1: DFS와 치즈개수 차이

DFS에서 0일 때와 1일 때를 다르게 처리하면서 1일 때 방문처리 및 벡터에 담고 탐색을 중단한다고 하셨는데요. 이 경우, 해당 위치를 더 이상 탐색하지 않기 때문에 벡터에 담긴 위치들은 시간이 지남에 따라 탐색되지 않은 상태로 남을 수 있습니다. 따라서 쌤이 구현한 방식과 치즈개수에서 차이가 날 수 있습니다.

DFS는 기본적으로 깊이 우선 탐색이며, 1일 때 탐색을 중단하면 치즈의 중복 탐색을 방지하지만 최종 결과에서는 탐색이 완료되지 않은 부분이 남아 있을 수 있어요. 반면, 강사님이 구현한 방식은 모든 경로를 철저히 탐색하고, 각 탐색에 대해 명확히 방문하지 않은 곳을 다시 검사해 보다 정확한 치즈의 영향을 측정합니다.

Q2: 시간 정보 포함하여 BFS/DFS 활용

동시 확산 문제에서는 시간을 고려한 BFS/DFS도 가능합니다. 이렇게 하시면, 각 노드에서 시간을 추적함으로써 탐색 시 어떻게 변화하는지를 쉽게 볼 수 있습니다. BFS에서 시간을 추가하는 것은 일반적인 패턴으로, 다음과 같이 구현할 수 있습니다:

void bfs(int y, int x) {
    queue<tuple<int, int, int>> q;
    q.push({y, x, 0});  // (y좌표, x좌표, 시간)

    while (!q.empty()) {
        auto [cy, cx, time] = q.front();
        q.pop();

        // 현재 위치에 대한 처리 작업

        // 다음 위치 탐색 및 시간 증가
        for (int i = 0; i < 4; i++) {
            int ny = cy + dy[i];
            int nx = cx + dx[i];

            if (조건에 맞는 유효성 검사) {
                q.push({ny, nx, time + 1});
            }
        }
    }
}

이렇게 하면 각 탐색 단계에서 시간이 어떻게 흘러가는지를 추적할 수 있습니다.


이와 관련된 보다 자세한 내용은 아래 유사한 질문들을 통해 확인하실 수 있습니다:
- 2636 치즈 질문드립니다
- 이 문제 DFS 풀이는 어떤가요?

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이호준님의 프로필 이미지
이호준

작성한 질문수

질문하기