PS/BOJ

3085: 사탕 게임

전라남도교육지원청 2023. 10. 1. 14:05
 

3085번: 사탕 게임

예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.

www.acmicpc.net

풀이

#idea

  • 0 ~ N - 1 까지의 가로, 세로에서 색깔 바꾸기 가능
  • 각 행, 열에 가장 많은 연속된 글자 찾기
  • 색깔 바꾸기는 한 번만 실행하므로 불필요한 반복을 줄이기 위해 전체 행, 열의 원래 연속 데이터를 확인

#구현방안

  • 색깔 바꾸기
    • k 와 k + 1의 색깔이 같은 경우, 바꿀 수 없음
  • 최대 연속 데이터 찾기
    • 초기 데이터에서 최대 연속 데이터 먼저 확인
    • 행에서 바꾸면 해당 행과 바뀐 데이터의 열의 최대 연속 데이터 확인
    • 열에서 바꾸면 해당 열과 바뀐 데이터의 행의 최대 연속 데이터 확인
using System;

class program
{
    static int N, count, tmp;
    static int[,] board = new int[50, 50];

    static void Main()
    {
        N = int.Parse(Console.ReadLine());
        for(int i = 0; i < N; i++)
        {
            string line = Console.ReadLine();
            for(int j = 0; j < N; j++)
            {
                if (line[j] == 'C') board[i, j] = 1;
                else if (line[j] == 'P') board[i, j] = 2;
                else if (line[j] == 'Z') board[i, j] = 3;
                else board[i, j] = 4;
            }
        }
        count = 0;

        // 행 최대값 확인
        for(int i = 0; i < N; i++)
        {
            int line = 1;
            for(int j = 0; j < N -1; j++)
            {
                if (board[i, j] == board[i, j + 1]) line++;
                else line = 1;
                count = Math.Max(count, line);
            }
        }


        // 열 최대값 확인
        for (int i = 0; i < N; i++)
        {
            int line = 1;
            for (int j = 0; j < N - 1; j++)
            {
                if (board[j, i] == board[j + 1, i]) line++;
                else line = 1;
                count = Math.Max(count, line);
            }
        }

        // 행 변경
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < N - 1; j++)
            {
                if (board[i, j] == board[i, j + 1]) continue;
                tmp = board[i, j]; board[i, j] = board[i, j + 1]; board[i, j + 1] = tmp;
                int line = 1;
                for(int k = 0; k < N - 1; k++)
                {
                    if (board[i, k] == board[i, k + 1]) line++;
                    else line = 1;
                    count = Math.Max(count, line);
                }
                line = 1;
                for(int k = 0; k < N -1; k++)
                {
                    if (board[k, j] == board[k + 1, j]) line++;
                    else line = 1;
                    count = Math.Max(count, line);
                }
                line = 1;
                for (int k = 0; k < N - 1; k++)
                {
                    if (board[k, j + 1] == board[k + 1, j + 1]) line++;
                    else line = 1;
                    count = Math.Max(count, line);
                }
                tmp = board[i, j]; board[i, j] = board[i, j + 1]; board[i, j + 1] = tmp;
            }
        }

        // 열 변경
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N - 1; j++)
            {
                if (board[j, i] == board[j + 1, i]) continue;
                tmp = board[j, i]; board[j, i] = board[j + 1, i]; board[j + 1, i] = tmp;
                int line = 1;
                for (int k = 0; k < N - 1; k++)
                {
                    if (board[k, i] == board[k + 1, i]) line++;
                    else line = 1;
                    count = Math.Max(count, line);
                }
                line = 1;
                for (int k = 0; k < N - 1; k++)
                {
                    if (board[j, k] == board[j, k + 1]) line++;
                    else line = 1;
                    count = Math.Max(count, line);
                }
                line = 1;
                for (int k = 0; k < N - 1; k++)
                {
                    if (board[j + 1, k] == board[j + 1, k + 1]) line++;
                    else line = 1;
                    count = Math.Max(count, line);
                }
                tmp = board[j, i]; board[j, i] = board[j + 1, i]; board[j + 1, i] = tmp;
            }
        }

        Console.WriteLine(count);
    }
}