문제 상근이는 어렸을 적에 “봄보니 (Bomboni)” 게임을 즐겨했다.
가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다.
사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하는 프로그램을 작성하시오.
입력 첫째 줄에 보드의 크기 N이 주어진다. (3 ≤ N ≤ 50)
다음 N개 줄에는 보드에 채워져 있는 사탕의 색상이 주어진다. 빨간색은 C, 파란색은 P, 초록색은 Z, 노란색은 Y로 주어진다.
사탕의 색이 다른 인접한 두 칸이 존재하는 입력만 주어진다.
출력 첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.
예제 입력 1
예제 출력 1
예제 입력 2
예제 출력 2
예제 입력 3 1 2 3 4 5 6 5 YCPZY CYZZP CCPPP YCYZC CPPZZ
예제 출력 3
내 코드 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); } }