Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 |
Tags
- Python
- JavaScript
- DFS
- 시뮬레이션
- spring boot
- 알고리즘
- Algorithm
- 알고리듬
- Trie
- BFS
- hash table
- SQL
- Back tracking
- Data Structure
- aws
- 구현
- CSV
- gpdb
- Priority Queue
- Vue.js
- Linked list
- 코테
- 모의SW역량테스트
- SWEA
- 코딩테스트
- django
- Bruth Force
- programmers
- boj
- GitHub
Archives
- Today
- Total
hotamul의 개발 이야기
[Algorithm][C++] BOJ 2606: 바이러스 (head Linked List) 본문
myt-algorithm-practice/Samsung SW Certi Pro
[Algorithm][C++] BOJ 2606: 바이러스 (head Linked List)
hotamul 2021. 11. 19. 23:15url: https://www.acmicpc.net/problem/2606
2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어
www.acmicpc.net
풀이 핵심
1. bfs 문제
2. 문제는 매우 간단하지만 Pro 시험에서 Linked List 자료구조는 필수로 구현할 줄 알아야 하므로 Linked List를 이용해 풀이해보고자 한다.
3. Linked List는 추가 연결이 필요할 때 연결 끝 부분 (Tail) 에 추가해줘야 하는 경우, 즉 list의 연결 순서가 중요할 경우 tail을 알 수 있도록 해서 tail 다음에 추가로 노드 연결을 한다. (Head, Tail로 구현하기) 허나 이 문제는 추가 연결 시 끝 부분 (Tail) 에 연결할 필요가 없으므로 (순서가 중요하지 않으므로) 다음과 같이 구조체와 연결 함수 (make)를 만들면 된다.
struct NODE {
int node;
NODE* next;
};
NODE HEAD[MAXV];
NODE POOL[MAXE * 2];
void make(int p, int c) {
NODE* nd = &POOL[pcnt++];
nd->node = c;
nd->next = HEAD[p].next;
HEAD[p].next = nd;
}
일반적으로 사용하는 동적 할당 malloc을 사용하지 않은 이유는 delete 하는데 번거로움이 있기 때문이다. 위와 같이 사용할 메모리를 전역으로 미리 만들어 필요할때마다 가져오는 방식으로 사용하는 것이 더욱 효과적이다.
4. bfs 구현하는 것은 전체 코드를 참고하자.
코드
#include <cstdio>
#define MAXN 101
int N, M, ans;
struct NODE {
int node;
NODE * next;
};
NODE HEAD[MAXN];
NODE POOL[MAXN*MAXN];
int visit[MAXN];
int pcnt;
void make(int p, int c) {
NODE* nd = &POOL[pcnt++];
nd->node = c;
nd->next = HEAD[p].next;
HEAD[p].next = nd;
}
int queue[MAXN*MAXN];
int fr, re;
void bfs() {
int cur;
fr = re = 0;
queue[re++] = 1;
visit[1] = 1;
while (fr != re) {
cur = queue[fr++];
for (NODE* p = HEAD[cur].next; p; p = p->next) {
if (visit[p->node] == 0) {
ans++;
queue[re++] = p->node;
visit[p->node] = 1;
}
}
}
}
int main() {
scanf("%d %d", &N, &M);
for (int i = 0; i < M; i++) {
int p, c;
scanf("%d %d", &p, &c);
make(p, c);
make(c, p);
}
bfs();
printf("%d", ans);
return 0;
}
'myt-algorithm-practice > Samsung SW Certi Pro' 카테고리의 다른 글
[Algorithm][C++] BOJ 1620: 나는야 포켓몬 마스터 이다솜 (Hash Table - Chaining (Single Linked List) (0) | 2021.11.22 |
---|---|
[Algorithm][C++] BOJ 3190: 뱀 (Double Linked List) (0) | 2021.11.21 |
[Algorithm][C++] BOJ 2606: 바이러스 (head, tail Linked List) (0) | 2021.11.20 |
[Data Structure][C++] Linked List (0) | 2021.11.19 |
[Algorithm][C++] BOJ 1707: 이분 그래프 (0) | 2021.11.19 |