본문 바로가기
코딩테스트 준비/백준 C#

백준 C# - 2667 +) 풀이

by 코딩하는 돼징 2023. 12. 14.
반응형

이 문제를 풀기 앞서 아래 문제를 풀고 오는 것을 추천한다. 2667이 아래 문제의 심화버전이다.

백준 C# - 1012

 

백준 C# - 1012 +) 풀이

먼저 문제 이해부터 해보자 문제에서 배추 흰지렁이가 한 배추의 상하좌우로 다른 배추로 이동할 수 있다고 나와있다. 1) DFS를 이용해서 상하좌우로 이동할 수 있을때까지 이동하면서 확인해야

code-piggy.tistory.com


백준 C# - 1012를 풀었다는 전제하에 문제 풀이를 진행하겠다.

출력에 필요한 두 부분

01 총 그룹의 갯수 출력(1012 : 지렁이의 갯수)

이 부분은 원래 1012와 동일하게 출력하면 된다.

02 단지내 집의 수 오름차순으로 출력(1012 : 각 지렁이에 해당되는 배추들의 수)

각 단지내 집의 수는 DFS가 호출되는 횟수와 동일하므로 DFS가 호출될때마다 이 값을 증가시킨다.

static void DFS(int x, int y)
{
    count++;
    graph[x, y] = 0;

    for (int i = 0; i<4;i++)
    {     
        int newX = x + dirX[i];
        int newY = y + dirY[i];
        if (graph[newX,newY] == 1)
        DFS(newX, newY);
    }
}

현재 그룹의 크기(count)는 DFS가 시작될때마다 초기화 시켜주어야 한다. 그리고 각 그룹의 크기를 answer리스트에 추가 해주어야 한다. 이를 추가한다음 다른 그룹을 찾아 이를 반복한다.

for (int i = 1; i <= N; i++)
{
    for (int j = 1; j <= N; j++)
    {
        if (graph[j, i] == 1)
        {
            count = 0;
            answer2++;
            DFS(j, i);
            answer.Add(count);
        }
    }
}

마지막으로 오름차순으로 정렬한 다음 출력한다.

answer.Sort();
foreach (int i in answer)
{
    Console.WriteLine(i);
}

코드 전문

using System;
using System.Collections.Generic;

namespace baek2
{
    class Program
    {
        static int[,] graph;
        static int count;
        static int[] dirX = { 1, -1, 0, 0 };
        static int[] dirY = { 0, 0, 1, -1 };
        static List<int> answer;
        static void DFS(int x, int y)
        {
            count++;
            graph[x, y] = 0;

            for (int i = 0; i < 4; i++)
            {
                int newX = x + dirX[i];
                int newY = y + dirY[i];
                if (graph[newX, newY] == 1)
                    DFS(newX, newY);
            }
        }
        public static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            graph = new int[30, 30];
            visited = new bool[30, 30];
            answer = new List<int>(55);
            int answer2 = 0;
            for (int i = 0; i < N; i++)
            {
                string a = Console.ReadLine();
                int index = 1;
                foreach (char c in a)
                {
                    graph[i + 1, index] = c - '0';
                    index++;
                }
            }

            for (int i = 1; i <= N; i++)
            {
                for (int j = 1; j <= N; j++)
                {
                    if (graph[j, i] == 1)
                    {
                        count = 0;
                        answer2++;
                        DFS(j, i);
                        answer.Add(count);
                    }
                }
            }
            Console.WriteLine(answer2);
            answer.Sort();
            foreach (int i in answer)
            {
                Console.WriteLine(i);
            }
        }
    }
}

 

반응형

'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글

백준 C# - 4963 +) 풀이  (1) 2023.12.18
백준 C# - 2178 +) 풀이  (0) 2023.12.16
백준 C# - 1012 +) 풀이  (0) 2023.12.14
백준 C# - 1707 +) 풀이  (0) 2023.12.10
백준 C# - 11724 +) 풀이  (0) 2023.12.10

댓글