완전탐색 문제로, 재귀함수를 이용하여 구현을 할 까 생각하다가, 결국에는 오른쪽, 아래 값만 비교해서 순차적으로 찾으면 되기 때문에 for문으로 구현했다.
사실 문제 푸는 도중에 조금 헷갈렸던 부분이 있었는데..
모두 같은 색으로 이루어져 있는 가장 긴 연속 부분을 고른 다음 그 사탕을 모두 먹는다
처음에 행,열 한줄 한줄 사탕을 먹으며 제일 큰 수를 찾으려 했다. 하지만
문제에 나와 있듯이 가장 긴 연속 부분을 찾아 그 부분만 먹으면 된다.
아래의 코드로 구현하면 된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
static int N;
static int result = Integer.MIN_VALUE;
static void calculate(char[][] b) {
// 행 비교하여 가장 긴 연속 부분을 찾아 사탕을 먹는다
for(int i = 0 ; i < N; i++) {
int sum1 = 1;
for(int j = 0 ; j < N-1; j++) {
if(b[i][j] == b[i][j+1]) {
sum1++;
} else {
sum1 = 1;
}
result = Math.max(result, sum1);
}
}
// 열 비교하여 가장 긴 연속 부분을 찾아 사탕을 먹는다
// 다른 방법으로 열을 비교해봤다.
int j = 0;
while(true) {
int sum2 = 1;
for(int i = 0 ; i < b.length-1; i++) {
if(b[i][j] == b[i+1][j]) {
sum2++;
} else {
sum2 = 1;
}
result = Math.max(result, sum2);
}
if(j == b.length-1) {
break;
}
j++;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
String a = "";
char[][] b = new char[N][N];
for(int i = 0 ; i < N; i ++) {
a = br.readLine();
for(int j = 0 ; j < N; j ++) {
b[i][j] = a.charAt(j);
}
}
// 아무것도 교환하지 않았을때
calculate(b);
// 행 비교
for(int i = 0 ; i < N; i++) {
for(int j = 0 ; j < N-1; j++) {
if(b[i][j] != b[i][j+1]) {
// 스왑
char temp = b[i][j];
b[i][j] = b[i][j + 1];
b[i][j + 1] = temp;
calculate(b);
// 원래대로
temp = b[i][j];
b[i][j] = b[i][j + 1];
b[i][j + 1] = temp;
}
}
}
// 열 비교
for(int i = 0 ; i < N; i++) {
for(int j = 0 ; j < N-1; j++) {
if(b[j][i] != b[j+1][i]) {
// 스왑
char temp = b[j][i];
b[j][i] = b[j + 1][i];
b[j + 1][i] = temp;
calculate(b);
// 원래대로
temp = b[j][i];
b[j][i] = b[j + 1][i];
b[j + 1][i] = temp;
}
}
}
System.out.print(result);
}
}