[白俊3085]キャンディゲーム-Java
問題を完全に探索し,再帰関数を用いて実現することを考慮し,最終的には右,下の値を比較して順次検索すればよいのでfor文で実現する.
実は問題を解く時少し混同しました
すべての人は同じ色からなる最長の連続部分を選んで、すべてのキャンディを食べてしまいます.
最初、私は一行で砂糖を食べて、最大の数を見つけたいと思っていました.でも.
質問の通り、一番長い連続部分を見つけて、その部分を食べればいいのです.
次のコードで実現すればいいです.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
static int N;
static int result = Integer.MIN_VALUE;
static void calculate(char[][] b) {
// 행 비교하여 가장 긴 연속 부분을 찾아 사탕을 먹는다
for(int i = 0 ; i < N; i++) {
int sum1 = 1;
for(int j = 0 ; j < N-1; j++) {
if(b[i][j] == b[i][j+1]) {
sum1++;
} else {
sum1 = 1;
}
result = Math.max(result, sum1);
}
}
// 열 비교하여 가장 긴 연속 부분을 찾아 사탕을 먹는다
// 다른 방법으로 열을 비교해봤다.
int j = 0;
while(true) {
int sum2 = 1;
for(int i = 0 ; i < b.length-1; i++) {
if(b[i][j] == b[i+1][j]) {
sum2++;
} else {
sum2 = 1;
}
result = Math.max(result, sum2);
}
if(j == b.length-1) {
break;
}
j++;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
String a = "";
char[][] b = new char[N][N];
for(int i = 0 ; i < N; i ++) {
a = br.readLine();
for(int j = 0 ; j < N; j ++) {
b[i][j] = a.charAt(j);
}
}
// 아무것도 교환하지 않았을때
calculate(b);
// 행 비교
for(int i = 0 ; i < N; i++) {
for(int j = 0 ; j < N-1; j++) {
if(b[i][j] != b[i][j+1]) {
// 스왑
char temp = b[i][j];
b[i][j] = b[i][j + 1];
b[i][j + 1] = temp;
calculate(b);
// 원래대로
temp = b[i][j];
b[i][j] = b[i][j + 1];
b[i][j + 1] = temp;
}
}
}
// 열 비교
for(int i = 0 ; i < N; i++) {
for(int j = 0 ; j < N-1; j++) {
if(b[j][i] != b[j+1][i]) {
// 스왑
char temp = b[j][i];
b[j][i] = b[j + 1][i];
b[j + 1][i] = temp;
calculate(b);
// 원래대로
temp = b[j][i];
b[j][i] = b[j + 1][i];
b[j + 1][i] = temp;
}
}
}
System.out.print(result);
}
}
Reference
この問題について([白俊3085]キャンディゲーム-Java), 我々は、より多くの情報をここで見つけました https://velog.io/@hyeokjinon/백준-3085-사탕게임-Javaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol