boj)3085 - 사탕 게임

2020. 9. 21. 20:18PS/boj

import java.io.*;

public class boj_3085 {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static char[][] a;

    // 연속된 길이 체크
    static int check(char[][] a) {
        int n = a.length;
        int ans = 1;

        for (int i = 0; i < n; i++) {
            int cnt = 1;

            // 같은 행에서의 연속길이 체크
            for (int j = 1; j < n; j++) {
                if (a[i][j] == a[i][j-1]) {
                    cnt ++;
                } else {
                    cnt = 1;
                }
                if (ans < cnt) ans = cnt;
            }

            cnt = 1;
            // 같은 열에서의 연속길이 체크
            for (int j = 1; j < n; j++) {
                if (a[j][i] == a[j-1][i]) {
                    cnt ++;
                } else {
                    cnt = 1;
                }
                if (ans < cnt) ans = cnt;
            }
        }
        return ans;
    }

    public static void main(String[] args) throws IOException {
        int n = Integer.parseInt(br.readLine());
        a = new char[n][n];

        for (int i = 0; i < n; i++) {
            String str = br.readLine();

            for (int j = 0; j < n; j++) {
                a[i][j] = str.charAt(j);
            }
        }

        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (j+1 < n) { // 오른쪽이랑 스왑
                    char t = a[i][j];
                    a[i][j] = a[i][j+1];
                    a[i][j+1] = t;

                    // 연속길이 체크 후 최댓값 저장
                    int temp = check(a);
                    if (ans < temp) ans = temp;

                    // 다시 바꿔놓기
                    t = a[i][j];
                    a[i][j] = a[i][j+1];
                    a[i][j+1] = t;
                }
                if (i+1 < n) { // 아래랑 스왑
                    char t = a[i][j];
                    a[i][j] = a[i+1][j];
                    a[i+1][j] = t;

                    // 연속길이 체크 후 최댓값 저장
                    int temp = check(a);
                    if (ans < temp) ans = temp;

                    // 다시 바꿔놓기
                    t = a[i][j];
                    a[i][j] = a[i+1][j];
                    a[i+1][j] = t;
                }
            }
        }

        System.out.println(ans);
    }
}

- 어떤식으로 반복문 돌려야할지 생각이 안나서 어려웠음

 

 

- 자리 바꾸기를 먼저하고 그 상태에서 길이를 체크

- 자리 바꾸기 -> N * N 배열을 전부 돌며 현재 위치에서 오른쪽 (j+1), 아래 (i+1) 이렇게 스왑해줌

- 상하좌우 4방향으로 스왑이 가능하지만 각 위치에서 오른쪽, 아래 이렇게 2방향만 스왑해줘도 

  전부 스왑한거와 같다.

- 자리 바꿧을때의 배열값으로 연속된 수가 몇개인지 check

- 자리바꾸기는 한 번만 가능하니까 스왑후에 다시 제자리로 돌려 놓기

 

- check의 경우에는 행으로 , 열로 나눠서 체크

- ans = 1 : 현재 나 자신

 

- 자리바꾸기 할때마다 check를 통해 받은 값으로 최댓값을 ans에 넣고 출력

'PS > boj' 카테고리의 다른 글

boj)1107 - 리모컨  (0) 2020.09.22
boj)1476 - 날짜 계산  (0) 2020.09.21
boj)2309 - 일곱 난쟁이  (0) 2020.09.21
boj)2133 - 타일 채우기  (0) 2020.09.21
boj)13398 - 연속합 2  (0) 2020.09.21