728x90
문제
https://www.acmicpc.net/problem/2667
코드
using System;
using System.Collections.Generic;
class Dongsik
{
static int n;
static int[,] map;
static bool[,] visited;
static int[] dy = {1, -1, 0, 0}; // 좌표
static int[] dx = {0, 0, -1, 1}; // 좌표
static void Main(string[] arg)
{
n = int.Parse(Console.ReadLine()); // n
map = new int[n, n];
visited = new bool[n, n];
// map 만들기
for(int i = 0; i < n; i++) // n번 반복
{
string input = Console.ReadLine();
for(int j = 0; j < n; j++)
{
map[i, j] = input[j] - '0';
}
}
int total = 0;
List<int> list = new List<int>();
// BFS
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(map[i, j] == 1 && !visited[i, j])
{
int size = BFS(i, j); // x, y
list.Add(size); // 단지 크기
total++; // 단지 수
}
}
}
Console.WriteLine(total);
list.Sort();
foreach(int a in list)
{
Console.WriteLine(a);
}
}
static int BFS(int i, int j)
{
Queue<(int, int)> queue = new Queue<(int, int)>(); // (x, y), (x, y)
queue.Enqueue((i, j));
visited[i, j] = true;
int cnt = 0;
while(queue.Count > 0)
{
(int x, int y) = queue.Dequeue();
cnt++;
for(int z = 0; z < 4; z++) // 4번 반복
{
// new 좌표 만들어주기
int newX = x + dx[z];
int newY = y + dy[z];
if(newX < n && newX >= 0 && newY < n && newY >= 0 && map[newX, newY] == 1 && visited[newX, newY] == false)
{
visited[newX, newY] = true;
queue.Enqueue((newX, newY));
}
}
}
return cnt;
}
}
고민
- 지도 만들기 [n, n]
- 좌표 {1, -1, 0, 0 }, { 0, 0, -1, 1 }
- BFS 돌리기
- return 단지 수
- BFS가 끝나면 return된 단지 수를 List<int> 저장, cnt 늘리기
- 단지수 오름차순으로 정렬 후(List 내장함수) Console.WriteLine();
계속 OverFlow발생했는데, using System.Collections.Generic;을 추가하지 않아서였다.
모두들 using을 습관화하자!
'동식이 취업시키기 작전 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 덧칠하기(C#) (0) | 2024.04.09 |
---|---|
[백준] 1012번 유기농 배추(C#) (1) | 2024.03.18 |
[백준] 2606번 바이러스(C#) (1) | 2024.03.15 |
[백준] 1926번 그림(C#) (0) | 2024.03.13 |
[백준] 2178번 미로찾기(C#) (1) | 2024.02.08 |