알고리즘/백준저지
백준저지 3085번 사탕 게임
anott
2021. 9. 10. 23:15
출처: https://www.acmicpc.net/problem/3085
3085번: 사탕 게임
예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.
www.acmicpc.net
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ3085 {
static int N, max, cnt;
static char[][] map;
static int[][] d = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; // 위 아래 왼쪽 오른쪽
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new char[N][N];
for (int i = 0; i < N; i++) { // 입력
StringTokenizer st = new StringTokenizer(br.readLine());
map[i] = (st.nextToken()).toCharArray();
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int dd = 0; dd < 4; dd++) { // 해당 사탕의 위 아래 오른쪽 왼쪽 모두 바꿔보기
int dx = i + d[dd][0];
int dy = j + d[dd][1];
if (isInMap(dx, dy)) {
swap(i, j, dx, dy); // 바꾸기
char[] col = new char[N]; // 해당 위치의 세로를 일차원 char 배열형태로 입력
for (int k = 0; k < N; k++) {
col[k] = map[k][j];
}
char[] row = new char[N]; // 해당 위치의 가로를 일차원 char 배열형태로 입력
for (int k = 0; k < N; k++) {
row[k] = map[i][k];
}
swap(dx, dy, i, j); // 원래대로 돌려놓기
max = Math.max(max, checkRowCol(row));
max = Math.max(max, checkRowCol(col));
}
}
}
}
System.out.println(max); // 답 출력
}
private static int checkRowCol(char[] rowcol) { // 일차원 배열에서 가장 많이 연속된 사탕 수 구하기
int cnt = 1;
int bigger = 0;
for (int i = 0; i < N - 1; i++) {
if (rowcol[i] == rowcol[i + 1]) {
cnt++;
} else {
bigger = Math.max(bigger, cnt);
cnt = 1;
}
}
bigger = Math.max(bigger, cnt);
return bigger;
}
private static boolean isInMap(int x, int y) { // 맵 안에 있는지 확인
if (x >= 0 && x < N && y >= 0 && y < N) {
return true;
}
return false;
}
private static void swap(int i, int j, int dx, int dy) { // 인접한 두 칸의 사탕 바꾸기
char temp = map[i][j];
map[i][j] = map[dx][dy];
map[dx][dy] = temp;
}
}