재바기
JaeTech
재바기
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • Computer Vision (2)
    • 선형대수학 (9)
    • Papers (1)
    • 알쓸신잡 (7)
    • 삽질 기록 (0)
    • 3D\Multiview Geometry (10)
      • CS231A (10)
    • Computer Science (46)
      • Algorithm (14)
      • JavaScript (3)
      • C || C++ (5)
      • Git || Github (3)
      • Linux (2)
      • DL || ML (5)
      • Operating System (8)
      • Computer Network (0)
      • Database (1)
      • Effective Python (5)
      • Data Communication (0)
    • 회고 (0)
    • Latex (1)

블로그 메뉴

  • 홈
  • 태그

Github

공지사항

  • 주인장에 대해

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
재바기

JaeTech

(C++) 백준 1260번 [DFS와 BFS]
Computer Science/Algorithm

(C++) 백준 1260번 [DFS와 BFS]

2022. 12. 30. 11:16
728x90

오랜만에 그래프 문제를 풀었다.

그래서 그런지 조금 낯설었지만 기본적인 문제라 나름 괜찮았다.

아주 전형적이고 기본적인 DFS, BFS문제라 가볍게 풀어보기 좋은 것 같다.

 

실버2 난이도

 

 


1. 문제 해결방법 구상

- DFS는 스택을 이용, BFS는 큐를 이용. (DFS에서 굳이 스택을 이용하지 않고 재귀를 이용해도 됨, 근데 한번 스택으로 구현해보았다.)
- DFS와 BFS의 관건은 언제 노드 방문 처리를 하고, 컨테이너에서 노드를 pop하는 지를 잘 고민해야함.
- DFS에서 스택을 이용해서 구현을 한다면, 더 이상 깊은 depth로 갈 수 없을 때( 더이상 edge가 없는 node에 이르렀을 때)를 어떻게 처리해주느냐가 중요.
- 뿐만 아니라 부모 노드로 다시 돌아갔을 때, 갈 수 있는 또 다른 node가 있는 지를 확인해줘야 하므로 이를 잘 처리해야 함.


2. 해결 방법 구상에 따라 코드 구현

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

int N, M, V;
vector<vector<int>> edge(1001);
// vector가 아닌 int 배열로 2차원 [1001][1001]로 해도 되지만
// 그렇게 하면 갈 수 있는 노드를 확인할 때 모든 node에 대해 확인해야 하므로
// 불필요한 시간을 소모함. 따라서 vector로 구현
bool visit_DFS[1001] = {false, };
bool visit_BFS[1001] = {false, };  // 그냥 memset안해주고 따로 둠

void DFS(int v) {
    stack<int> s;
    s.push(v);
    bool nowhere = true;
    visit_DFS[v] = true;
    cout << v << " ";

    while(!s.empty()) {
        int top = s.top();
        nowhere = true;
        // nowhere은 해당 노드에서 갈 node가 없는 경우 확인을 위한 flag
        for(int i = 0; i < edge[top].size(); i++) {
            if (!visit_DFS[edge[top][i]]) {
                int n_node = edge[top][i];
                s.push(n_node);
                visit_DFS[n_node] = true;
                cout << n_node << " ";
                nowhere = false;
                break;
            }
        }
        if (nowhere) {
            s.pop();
        }
    }
}

void BFS(int v) {
    queue<int> q;
    q.push(v);

    while(!q.empty()) {
        int f = q.front();
        q.pop();
        if (visit_BFS[f])  continue;
        visit_BFS[f] = true;
        cout << f << " ";
        for(int i = 0; i < edge[f].size(); i++) {
            if (!visit_BFS[edge[f][i]]) {
                q.push(edge[f][i]);
            }
        }
    }
}

int main() {
    cin >> N >> M >> V;
    for(int i = 0; i < M; i++) {
        int n1, n2;
        cin >> n1 >> n2;
        edge[n1].push_back(n2);
        edge[n2].push_back(n1);
    }
    for(int i = 0; i < edge.size(); i++) {
    	// vector로 edge를 구현했으므로 노드를 
        // 노드의 숫자순으로 오름차순 정렬해주어야 한다.
        sort(edge[i].begin(), edge[i].end());
    }
    DFS(V);
    cout << endl;
    BFS(V);
}

3. 느낀 점

기본적인 DFS, BFS 뿐만 아니라 그래프 개념을 적용한 복잡한 문제도 접해볼 필요가 있다고 느꼈다.

그리고 많은 코테 문제들이 DP와  그래프가 주가 되기 때문에 그래프 문제를 더 자주 접하는 게 중요한 것 같다.

 

 

//문제제기 및 피드백 언제든지 감사히 받겠습니다.​ 

728x90
저작자표시 비영리 (새창열림)

'Computer Science > Algorithm' 카테고리의 다른 글

(C++) 백준 1012번 [유기농 배추]  (0) 2023.01.03
(C++) 백준 3613번 [Java vs C++]  (0) 2022.12.28
(C++) 백준 1915번 [가장 큰 정사각형]  (0) 2021.03.10
(C++) 백준 2468번 [안전 영역]  (0) 2021.03.10
(C++) 백준 1149번 [RGB거리]  (0) 2021.03.07
    'Computer Science/Algorithm' 카테고리의 다른 글
    • (C++) 백준 1012번 [유기농 배추]
    • (C++) 백준 3613번 [Java vs C++]
    • (C++) 백준 1915번 [가장 큰 정사각형]
    • (C++) 백준 2468번 [안전 영역]
    재바기
    재바기
    재박이의 테크블로그

    티스토리툴바