이번 포스트에서는 백준 3085번 문제를 해결하는 방법에 대해 설명하겠습니다. 문제는 NxN 크기의 사탕판에서 인접한 두 사탕을 교환하여 같은 색의 사탕이 연속으로 가장 많이 이어지는 부분의 사탕 개수를 구하는 것입니다. 이를 위해 다음과 같은 방법으로 접근하였습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class P3085 {
// 주어진 배열에서 가장 긴 연속 부분을 찾는 함수
private static int findMax(char[][] arr, int n) {
int max = 0;
// 가로 검사
for (int i = 0; i < n; i++) {
int tempCount = 1;
for (int j = 1; j < n; j++) {
if (arr[i][j] == arr[i][j-1]) {
tempCount++;
} else {
max = Math.max(max, tempCount);
tempCount = 1;
}
}
max = Math.max(max, tempCount);
}
// 세로 검사
for (int j = 0; j < n; j++) {
int tempCount = 1;
for (int i = 1; i < n; i++) {
if (arr[i][j] == arr[i-1][j]) {
tempCount++;
} else {
max = Math.max(max, tempCount);
tempCount = 1;
}
}
max = Math.max(max, tempCount);
}
return max;
}
// 메인 함수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
char[][] table = new char[n][n];
// 입력 받기
for (int i = 0; i < n; i++) {
String row = br.readLine();
for (int j = 0; j < n; j++) {
table[i][j] = row.charAt(j);
}
}
int countMax = 0;
// 사탕 교환 및 최대 연속 사탕 개수 계산
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 가로로 교환
if (j < n - 1 && table[i][j] != table[i][j + 1]) {
swap(table, i, j, i, j + 1);
countMax = Math.max(countMax, findMax(table, n));
swap(table, i, j, i, j + 1); // 원상복구
}
// 세로로 교환
if (i < n - 1 && table[i][j] != table[i + 1][j]) {
swap(table, i, j, i + 1, j);
countMax = Math.max(countMax, findMax(table, n));
swap(table, i, j, i + 1, j); // 원상복구
}
}
}
// 결과 출력
System.out.println(countMax);
}
// 배열의 두 요소를 교환하는 함수
private static void swap(char[][] arr, int i1, int j1, int i2, int j2) {
char temp = arr[i1][j1];
arr[i1][j1] = arr[i2][j2];
arr[i2][j2] = temp;
}
}
BufferedReader
를 사용하여 입력을 받고, 이를 table
배열에 저장합니다.
findMax
함수는 주어진 배열에서 가장 긴 연속된 사탕의 개수를 계산합니다. 가로와 세로를 각각 검사하여 최대 값을 갱신합니다.
이중 for 루프를 사용하여 각 위치에서 가로와 세로로 인접한 사탕을 교환합니다. 교환 후 findMax
함수를 호출하여 최대 연속 사탕 개수를 계산하고, 다시 원상복구합니다.
모든 교환을 시도한 후 최대 연속 사탕 개수를 출력합니다.
이 코드의 핵심은 인접한 사탕을 교환하고 최대 연속 사탕 개수를 계산하는 것입니다. 모든 가능한 교환을 시도하여 최종 결과를 도출합니다. 이 방법으로 백준 3085번 문제를 성공적으로 해결할 수 있습니다.