https://www.acmicpc.net/problem/2606
BFS/DFS로 풀 수 있는 문제이다.
나는 BFS로 풀었다. 아직 BFS의 형식이 자연스럽게 나오지는 않는다.
그래서 처음 배웠던 포스팅을 매번 다시 문제에 맞게 변형하며 공부한다. 이 과정은 꽤나 재미있게 느껴진다.
처음에는 그저 형식을 암기해서 풀어나갔다면, 지금은 이 부분에서는 이렇게 풀어나가면 되겠구나?생각이 든다.
마냥 어렵기만 하던 BFS의 로직이 이해가 가기 시작했다. 다음에는 DFS로도 풀어봐야겠다.
using System;
namespace B2606
{
class Program
{
static int[] visited = new int[101];
static void Main()
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
int n = int.Parse(sr.ReadLine()); //n개
int m = int.Parse(sr.ReadLine()); //m쌍
Queue<int> q = new Queue<int>(); //방문 예정지
int[,] map = new int[n + 1, n + 1];
int count = -1; //바이러스에 걸리게 되는 컴퓨터의 수, 1번 컴퓨터는 세지 않음
int x = 1; //1번 컴퓨터에서 시작
for(int i = 0; i < m; i++) //m쌍의 입력을 받아 map 만들기
{
int[] pc = Array.ConvertAll(sr.ReadLine().Split(' '), int.Parse);
map[pc[0], pc[1]] = 1;
map[pc[1], pc[0]] = 1;
}
q.Enqueue(x);
while (q.Count > 0)
{
x = q.Dequeue();
if (visited[x] == 0) //방문기록 없다면
{
visited[x] = 1; // x방문
count++; //바이러스+1
}
for (int y= 1; y <= n; y++) //연결되어있고 방문기록 없다면, 방문예정지에 추가
if (map[x, y] == 1 && visited[y] == 0) q.Enqueue(y);
}
sw.Write(count);
sr.Close();
sw.Flush();
sw.Close();
}
}
}
'알고리즘 > 백준 BOJ' 카테고리의 다른 글
[ BOJ/C# ] 1260 DFS와 BFS (0) | 2023.09.26 |
---|---|
[ BOJ/C# ] 11724 연결 요소의 개수 (0) | 2023.09.26 |
[ BOJ/C# ] 9461 파도반 수열 (0) | 2023.09.24 |
[ BOJ/C# ] 11727 2×n 타일링 2 (0) | 2023.09.23 |
[ BOJ/C# ] 11726 2×n 타일링 (0) | 2023.09.22 |