ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boj)3085 - 사탕 게임
    PS/boj 2020. 9. 21. 20:18
    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
킹수빈닷컴