문제

상근이는 어렸을 적에 “봄보니 (Bomboni)” 게임을 즐겨했다.

가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다.

사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 보드의 크기 N이 주어진다. (3 ≤ N ≤ 50)

다음 N개 줄에는 보드에 채워져 있는 사탕의 색상이 주어진다. 빨간색은 C, 파란색은 P, 초록색은 Z, 노란색은 Y로 주어진다.

사탕의 색이 다른 인접한 두 칸이 존재하는 입력만 주어진다.

출력

첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.

예제 입력 1

1
2
3
4
3
CCP
CCP
PPC

예제 출력 1

1
3

예제 입력 2

1
2
3
4
5
4
PPPP
CYZY
CCPY
PPCC

예제 출력 2

1
4

예제 입력 3

1
2
3
4
5
6
5
YCPZY
CYZZP
CCPPP
YCYZC
CPPZZ

예제 출력 3

1
4

내 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
const [n, ...input] = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const N = +n;
let candy = input.map((v) => v.split(""));

let max = 1;

for (let i = 0; i < N; i++) {
if (max == N) break;
for (let j = 0; j < N; j++) {
if (max == N) break;
candySwap(i, j);
}
}
console.log(max);

function candySwap(i, j) {
const dir = [
[0, 1],
[1, 0],
];
dir.forEach((v) => {
const [x, y] = v;

if (
i + x > -1 &&
j + y > -1 &&
i + x < N &&
j + y < N &&
candy[i + x][j + y] != candy[i][j]
) {
let temp = candy[i][j];
candy[i][j] = candy[i + x][j + y];
candy[i + x][j + y] = temp;
checkRow();
checkColumn();
candy[i + x][j + y] = candy[i][j];
candy[i][j] = temp;
}
});
}

function checkRow() {
for (let i = 0; i < N; i++) {
let checkArr = [1];
for (let j = 1; j < N; j++) {
checkArr[j] = candy[i][j - 1] == candy[i][j] ? checkArr[j - 1] + 1 : 1;
}
max = Math.max(...checkArr, max);
}
}

function checkColumn() {
for (let i = 0; i < N; i++) {
let checkArr = [1];
for (let j = 1; j < N; j++) {
checkArr[j] = candy[j - 1][i] == candy[j][i] ? checkArr[j - 1] + 1 : 1;
}
max = Math.max(...checkArr, max);
}
}