알고리즘/백준 알고리즘(JAVA)

JAVA)3085번 사탕게임 - 브루트 포스

starmk95 2020. 8. 2. 16:48
import java.util.*;

public class Main {
    static char[][] candy;
    static int ans = 1;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int cnt = sc.nextInt();
        candy = new char[cnt][cnt];
        for (int i=0;i<cnt;i++) {
            candy[i] = sc.next().toCharArray();
        }
        // 브루트 포스
        // n^2개의 데이터를 입력받는데 n^2, 인접한 두 칸 고르기 = 4(n^2) (인전 -> 상하좌우 4가지 경우)
        // 그러나 첫 원소부터 오른쪽 또는 아래의 원소와 바꾸다보면 다음 원소에서의 위 또는 왼쪽 원소와 바꾸는 연산은 중복되는 연산이므로 수행할 필요가 없다.
        // 그러므로 각 원소마다 오른쪽과 아래의 원소만 교환하는 경우만 생각하면 된다. -> 2(n^2)
        // 바꾼 칸의 경우마다 가장 긴 연속 부분을 고르기 (행과 열 모두 탐색) -> 각 경우마다 2(n^2)만큼 걸림
        // 결과적으로 O(n^4) 걸림
        for (int i=0;i<cnt;i++) {
            for (int j=0;j<cnt;j++) {
                // 오른쪽과 교환
                if (j+1 < cnt) {
                    char temp = candy[i][j];
                    candy[i][j] = candy[i][j+1];
                    candy[i][j+1] = temp;
                    int len = findLen();
                    if (ans < len) ans = len;
                    // 원상복귀
                    candy[i][j+1] = candy[i][j];
                    candy[i][j] = temp;
                }
                // 아래쪽과 교환
                if (i+1 < cnt) {
                    char temp = candy[i][j];
                    candy[i][j] = candy[i+1][j];
                    candy[i+1][j] = temp;
                    int len = findLen();
                    if (ans < len) ans = len;
                    // 원상복귀
                    candy[i+1][j] = candy[i][j];
                    candy[i][j] = temp;
                }
            }
        }
        System.out.println(ans);
    }
    static int findLen() {
        int n = candy.length;
        int len = 1;
        for (int i=0;i<n;i++) {
            // 행검사
            int temp = 1;
            for (int j=1;j<n;j++) {
                if (candy[i][j] == candy[i][j-1]) {
                    temp += 1;
                } else temp = 1;
                if (len < temp) len = temp;
            }
            // 열검사
            temp = 1;
            for (int j=1;j<n;j++) {
                if (candy[j][i] == candy[j-1][i]) {
                    temp+=1;
                } else temp = 1;
                if (len < temp) len = temp;
            }
        }
        return len;
    }
}