풀이
#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);
}
}