티스토리 뷰
이 글은 BOJ 2606-바이러스 문제에 대해 다루겠습니다. BFS, DFS관련 게시글은 요이따 여기에 있습니다. 공부한 것을 정리하는 형식으로 작성되었으므로 오류가 있을 수 있습니다. 오류 발견시 댓글로 꼭 말씀해주세요! 시작해볼까요?
결론부터 말하자면 문제를 풀 때 DFS를 쓰는 것이 더 적합합니다. 왜냐하면 바이러스에 걸린 1번 컴퓨터와 연결된 모든 컴퓨터를 찾아야 하기 때문입니다. DFS는 모든 노드를 traverse할 때, BFS는 path finding을 할 때 잘 쓰이기 때문입니다. 그런데 저는 BFS로 풀었냐구요? 음... 약간 제가 재귀문 트라우마가 있어서 BFS로 먼저 짰다가 시간 초과나면 DFS로 갈아탈 생각이었습니다. 뭐... 코테 볼 때나 면접 볼 때 그럴 여유는 없겠지만 우리는 연습 중이니 두 코드 모두 짜도 되지 않겠습니까?
풀이 1 : BFS
(코드 복사를 원하시는 분은 [더보기]를 눌러주세요.)
더보기
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main(void){
// computers : total number of computers
// connections : total number of connections
int computers, connections, comA, comB;
int v = 1; // starting computer
cin >> computers >> connections;
vector<int> *ptr = new vector<int>[computers + 1]; // +1 because computer starts from 1 (not 0)
for(int i = 0; i < connections; i++){
cin >> comA >> comB;
ptr[comA].push_back(comB);
ptr[comB].push_back(comA); // undirected graph
}
queue<int> que;
vector<int> connectedComputers;
bool flag[computers + 1]; // +1 because computer starts from 1
for(int i = 0; i < computers + 1; i++)
flag[i] = false;
que.push(v);
flag[v] = true;
vector<int>::iterator it;
while(!que.empty()){
v = que.front();
connectedComputers.push_back(v);
que.pop();
for(it = ptr[v].begin(); it != ptr[v].end(); ++it){
if(flag[*it] == false){
flag[*it] = true;
que.push(*it);
}
}
}
cout << connectedComputers.size() - 1 << endl;
return 0;
}
결과 : 사용메모리 1984KB 맞았습니다!
풀이 2 - DFS
이제 한 번 제대로 풀어볼까요?ㅋㅋ 위와 코드와 비교했을 때 자잘하게 달라진 점이 몇가지가 있습니다. 사실 뭐 풀이 로직이 변한 것은 당연하지만 정답 출력 방식이라던지 자잘한 변화들이 있습니다. 스택을 쓸까 재귀문을 쓸까 하다가 빠르게 구현 가능한(저에게 dfs는 써브니까요... 사랑해 bfs...ㅋㅋ) 재귀문으로 만들어 보았습니다.
(코드 복사를 원하시는 분은 [더보기]를 눌러주세요.)
더보기
#include <iostream>
#include <vector>
using namespace std;
int answer = 0; // answer
void dfs(vector<int> *graph, int v, bool *flag){
answer++;
flag[v] = true;
vector<int>::iterator it;
for(it = graph[v].begin(); it != graph[v].end(); ++it){
if(flag[*it] == false){
dfs(graph, *it, flag);
}
}
}
int main(void){
// computers : total number of computers
// connections : total number of connections
int computers, connections, comA, comB;
cin >> computers >> connections;
vector<int> *ptr = new vector<int>[computers + 1]; // +1 because computer starts from 1 (not 0)
for(int i = 0; i < connections; i++){
cin >> comA >> comB;
ptr[comA].push_back(comB);
ptr[comB].push_back(comA); // undirected graph
}
bool flag[computers + 1]; // +1 because computer starts from 1
for(int i = 0; i < computers + 1; i++)
flag[i] = false;
dfs(ptr, 1, flag);
cout << answer - 1 << endl;
return 0;
}
결과 : 사용메모리 1984KB 맞았습니다!
'CS > 알고리즘' 카테고리의 다른 글
[프로그래머스] Level 1에서 볼 만한 문제 (0) | 2020.06.17 |
---|---|
[프로그래머스] 탑 (0) | 2020.05.08 |
[개념] BFS & DFS (0) | 2020.05.07 |
[프로그래머스] 카펫 (0) | 2020.05.07 |
[프로그래머스] 소수 찾기 (0) | 2020.05.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 컴공졸작
- 부스트캠프
- RxSwift
- 삼성소프트웨어아카데미
- nosql
- 코딩테스트
- 부캠
- firebase
- swacademy
- 데이터분석
- 운영체제
- 코테
- 소프트웨어역량시험
- 소프트웨어아카데미
- 인턴
- 알고리즘
- 보안
- TableView
- 컴퓨터공학
- 프로그래머스
- SWIFT
- C++
- 부스트캠프2020
- 졸업작품
- 삼성
- OS
- 커넥트재단
- ios
- 개발자인턴
- 컴과졸작
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함