inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

3-L

3-L 질문있습니다 :)

해결된 질문

119

한유태

작성한 질문수 79

0

안녕하세요 선생님 🙂

DFS를 이용한 완전탐색 문제인 것을 확인하였고, 덕분에 문제없이 문제를 풀 수 있었습니다. 감사합니다 :)

 

문제를 한 가지 방법이 아닌 여러 방법으로 접근해보고 있는데요, BFS를 이용한 완전탐색으로 변형을 해보려고 하는데 쉽지가 않네요;; ㅎㅎ

 

기존의 DFS와 BFS는 가중치만 없다면 자유롭게 변형이 가능해서 당연히 가능할거라고 생각했는데요, 이번 문제는 완전탐색까지 고려하자니 기존 방식대로는 안되는 것 같습니다. 조언 주시면 정말 감사하겠습니다!!

c++ 코딩-테스트

답변 2

0

큰돌

안녕하세요 ㅎㅎ

문제를 한 가지 방법이 아닌 여러 방법으로 접근해보고 있는데요, BFS를 이용한 완전탐색으로 변형을 해보려고 하는데 쉽지가 않네요;; ㅎㅎ

>> 이문제는 BFS로 하기에는 까다롭습니다.

이 문제의 경우 모든 경우의 수를 탐색해야 하는 것이고

그럴 때는 보통

        if(visited[next] == 0){
            visited[next] = 1; 
            go(ny, nx, cnt + 1);
            visited[next] = 0;  
        } 

이런식의 코드가 일반적인데 이를 queue에 담아서 구현하는 BFS로는 어렵습니다만...

이렇게 구현할 수는 있습니다.

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

int R, C, ret;
char a[21][21];
const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, 1, 0, -1};

struct State {
    int y, x, cnt;
    bitset<26> visited;
};

void bfs() {
    queue<State> q;
    State start = {0, 0, 1, 0};
    start.visited[a[0][0] - 'A'] = 1;
    q.push(start);
    
    while (!q.empty()) {
        State cur = q.front();
        q.pop();
        ret = max(ret, cur.cnt);
        
        for (int i = 0; i < 4; i++) {
            int ny = cur.y + dy[i], nx = cur.x + dx[i];
            if (ny < 0 || ny >= R || nx < 0 || nx >= C) continue;
            int next = a[ny][nx] - 'A';
            
            if (!cur.visited[next]) {
                State nextState = {ny, nx, cur.cnt + 1, cur.visited};
                nextState.visited[next] = 1;
                q.push(nextState);
            }
        }
    }
}

int main() {
    cin >> R >> C;
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            cin >> a[i][j];
        }
    }
    bfs();
    cout << ret << '\n';
    return 0;
}

하지만 다음과 같이 메모리초과가 뜨고 굳이 이 방법을 추천드리지 않습니다.

image.png

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


0

인프런 AI 인턴

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

DFS(깊이 우선 탐색)와 BFS(너비 우선 탐색) 모두 완전 탐색 기법으로 사용될 수 있음은 분명합니다. 두 탐색 기법은 모두 그래프의 모든 노드를 방문하는 방법이지만, 그 접근 방식에서 차이가 있습니다. DFS는 한 경로를 맨 끝까지 탐색한 후 다른 경로를 탐색하는 반면, BFS는 시작점에서 가까운 노드부터 차례대로 탐색해 나갑니다.

DFS를 사용하여 문제를 해결한 경우, 일반적으로 재귀 함수를 통해 간단하게 구현할 수 있습니다. 그러나 BFS를 사용할 때는 Queue를 사용하여 구현하는 것이 일반적입니다. 이는 BFS가 동작하는 방식과 매우 밀접한 관련이 있습니다.

BFS를 이용한 완전탐색으로 접근하려 할 때 고려해야 하는 부분은 BFS가 각 노드를 방문할 때 도달 가능한 모든 경로를 거의 동시에 확장한다는 점입니다. 따라서, 기존 DFS를 통해 구현한 로직을 BFS로 변환하려면, 현재 노드에서 이동할 수 있는 모든 노드를 큐에 넣고, 이들 노드를 순차적으로 다시 탐색하는 방식으로 변경해야 합니다.

만약 이번 문제가 기존의 방식대로 BFS 변환에 어려움을 겪고 있다면, 문제의 특성을 다시 한번 살펴볼 필요가 있습니다. 문제의 구조, 요구하는 해결 방법 또는 최적화 조건 등을 고려하여 BFS가 유용하게 적용될 수 있는 방식을 찾아보시는 것이 좋습니다. BFS를 적용하려면 문제의 구조를 이해하고, 이를 어떻게 Queue로 관리하면서 단계별로 탐색할지 고민해보는 것이 중요합니다.

종종, 특정 문제에서는 BFS가 DFS보다 더 효율적인 해결 방법을 제공할 수 있습니다. 예를 들어, 최단 경로를 찾는 문제는 BFS를 사용해야 더 쉽게 접근할 수 있습니다. 따라서, 문제의 요구 사항과 조건을 철저히 분석한 후 적절한 탐색 기법을 선택하는 것이 중요합니다.

BFS를 적용하는 데 있어서 특별히 유의해야 할 점이나, 구현과 관련된 구체적인 도움이 필요하다면, 더 자세한 코드의 구조나 문제의 세부적인 내용을 공유해주시면 좋겠습니다.

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

0

18

1

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

0

28

2

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

0

67

1

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

0

29

1

진행 방법 질문드립니다!

0

62

2

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

0

60

2

2주차 개념#12 트리 순회

0

29

2

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

0

289

2

백준 서비스 종료

9

898

1

sk 하이닉스 코테 대비

0

371

2

3-G 최댓값 질문

0

51

1

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

0

83

2

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

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

102

2

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

0

66

2

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

0

173

2

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

0

69

2

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

0

64

2

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

0

51

2

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

0

68

2

함수별 시간복잡도

0

74

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

54

2