[BOJ][C#] 16918 봄버맨

LimJaeJun·2023년 12월 13일
0

PS/BOJ

목록 보기
63/108

📕 문제

📌 링크

📗 접근 방식

봄버맨이 터트리는 로직 제작 (Bomberman(char[,] board))

  • 리턴할 새로운 배열 선언
  • 기존 배열에서 폭탄(O)이라면 큐에 담는다. 기존 배열과 반대로 새로운 배열에 저장한다.
  • 큐에서 하나씩 꺼내면서 상하좌우를 .로 저장한다.

필요한 배열은 총 4개다.
1. 최초의 배열
2. 모두 폭탄인 배열
3. 최초의 배열을 터트린 배열
4. 3번을 터트린 배열

순서상 1 2 3 2 4 2 3 2 4 2 3 2 4 2 ... 이렇게 반복이 된다.

  • 1일때는 1번을 출력
  • 짝수일때는 2번을 출력
  • 3 9 13 17 ... 에는 3번을 출력
  • 5 11 15 19 ... 에는 4번을 출력

출력시
코드를 반복하기 귀찮아 StringBuilderExtension 확장 클래스 제작

  • 배열을 입력받아
  • 새로운 StringBuilder에 행렬로 넣어서
  • string값으로 반환

📘 코드

using System.Text;

namespace BOJ_16918
{
    public static class StringBuilderExtension
    {
        public static string Append2DArrayToString(char[,] array)
        {
            StringBuilder stringBuilder = new StringBuilder();
            
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    stringBuilder.Append(array[i, j]);
                }

                stringBuilder.AppendLine();
            }

            return stringBuilder.ToString();
        }
    }
    
    class Program
    {
        static void Main()
        {
            using StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
            using StreamWriter sw = new StreamWriter(new BufferedStream(Console.OpenStandardOutput()));

            
            
            int[] inputs = sr.ReadLine().Split().Select(int.Parse).ToArray();
            int R = inputs[0];
            int C = inputs[1];
            int N = inputs[2];

            char[,] board = new char[R, C];
            char[,] bombBoard = new char[R, C];

            for (int i = 0; i < R; i++)
            {
                string s = sr.ReadLine();
                for (int j = 0; j < C; j++)
                {
                    board[i, j] = s[j];
                    bombBoard[i, j] = 'O';
                }
            }

            char[,] bomberFirstBoard = Bomberman(R, C, board);
            char[,] bomberSecondBoard = Bomberman(R, C, bomberFirstBoard);

            // 1일 때 원본
            if (N == 1)
            {
                sw.WriteLine(StringBuilderExtension.Append2DArrayToString(board));
            }

            // 짝수 일때 전부 폭탄
            else if (N % 2 == 0)
            {
                sw.WriteLine(StringBuilderExtension.Append2DArrayToString(bombBoard));
            }

            else switch (N % 4)
            {
                // 3 7 11 15 ...
                case 3:
                    sw.WriteLine(StringBuilderExtension.Append2DArrayToString(bomberFirstBoard));

                    break;
                // 5 9 13 17 ...
                case 1:
                    sw.WriteLine(StringBuilderExtension.Append2DArrayToString(bomberSecondBoard));

                    break;
            }
        }

        static char[,] Bomberman(int R, int C, char[,] board)
        {
            Queue<(int, int)> q = new Queue<(int, int)>();
            char[,] newBoard = new char[R, C];
            int[] dx = { 1, 0, -1, 0 };
            int[] dy = { 0, 1, 0, -1 };
            
            for (int i = 0; i < R; i++)
            {
                for (int j = 0; j < C; j++)
                {
                    if (board[i, j] == 'O')
                    {
                        q.Enqueue((i, j));
                        newBoard[i, j] = '.';
                    }
                    else 
                        newBoard[i, j] = 'O';
                    
                }
            }

            while (q.Count > 0)
            {
                (int x, int y) = q.Dequeue();

                for (int dir = 0; dir < 4; dir++)
                {
                    int nx = x + dx[dir];
                    int ny = y + dy[dir];

                    if (nx < 0 || nx >= R || ny < 0 || ny >= C) continue;

                    newBoard[nx, ny] = '.';
                }
            }

            return newBoard;
        }
    }
}

📙 오답노트

📒 알고리즘 분류

  • 구현
  • 그래프 이론
  • 그래프 탐색
  • 시뮬레이션
profile
Dreams Come True

0개의 댓글

관련 채용 정보