-
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