https://www.acmicpc.net/problem/3085
3085번: 사탕 게임
예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main
{
public static int n;
public static String[][] garoChange(String[][] map, int i, int j){
String[][] copyMap = new String[n][n];
for(int k=0; k<n; k++){
copyMap[k] = Arrays.copyOf(map[k],n);
}
if(j+1<n){
String temp =copyMap[i][j];
copyMap[i][j] = copyMap[i][j+1];
copyMap[i][j+1] = temp;
}
else{
return map;
}
return copyMap;
}
public static String[][] seroChange(String[][] map, int i, int j){
String[][] copyMap = new String[n][n];
for(int k=0; k<n; k++){
copyMap[k] = Arrays.copyOf(map[k],n);
}
if(i+1<n){
String temp =copyMap[i][j];
copyMap[i][j] = copyMap[i+1][j];
copyMap[i+1][j] = temp;
}
else{
return map;
}
return copyMap;
}
public static int countCandy(String[][] map){
int maxCount = 1;
for(int i=0; i<n; i++){
String garoEx = "";
int garoCount=0;
String seroEx = "";
int seroCount=0;
for(int j=0; j<n; j++){
//가로
if(garoEx.equals(map[i][j])){
garoCount++;
maxCount=Math.max(maxCount,garoCount);
}else{
garoEx=map[i][j];
garoCount=1;
}
//세로
if(seroEx.equals(map[j][i])){
seroCount++;
maxCount=Math.max(maxCount,seroCount);
}else{
seroEx=map[j][i];
seroCount=1;
}
}
}
return maxCount;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.valueOf(br.readLine());
String[][] map =new String[n][n];
// 1. 입력받기
for(int i=0; i<n;i++){
String[] temp = br.readLine().split("");
for(int j=0; j<n;j++){
map[i][j] = temp[j];
}
}
int maxCount = 0;
for(int i=0; i<n;i++){
for(int j=0; j<n;j++){
// 2.오른쪽과 교체
String[][] garoChangedMap = garoChange(map,i,j);
// 3.아래쪽과 교체
String[][] seroChangedMap = seroChange(map,i,j);
// 4. 최대 사탕 갯수 세기
maxCount = Math.max(maxCount,countCandy(garoChangedMap));
maxCount = Math.max(maxCount,countCandy(seroChangedMap));
}
}
bw.write(maxCount+"");
bw.flush();
}
}
import java.util.Scanner;
class Main
{
public static int calcScore(char[][] map) {
int N = map.length;
int maxScore = 0;
// 가장 긴 연속 column 길이 찾기
for (int r = 0; r < N; r++) {
int scr = 1;
for (int c = 1; c < N; c++) {
if (map[r][c] == map[r][c - 1]) scr++;
else {
maxScore = Math.max(maxScore, scr);
scr = 1;
}
}
maxScore = Math.max(maxScore, scr);
}
// 가장 긴 연속 row 길이 찾기
for (int c = 0; c < N; c++) {
int scr = 1;
for (int r = 1; r < N; r++) {
if (map[r][c] == map[r - 1][c]) scr++;
else {
maxScore = Math.max(maxScore, scr);
scr = 1;
}
}
maxScore = Math.max(maxScore, scr);
}
return maxScore;
}
public static void swapCandy(char[][] map, int r1, int c1, int r2, int c2) {
char tmp = map[r1][c1];
map[r1][c1] = map[r2][c2];
map[r2][c2] = tmp;
}
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
char[][] map = new char[N][N];
for (int i = 0; i < N; i++)
map[i] = sc.next().toCharArray();
int ans = 0;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++){
// swap right
if (j + 1 < N) {
swapCandy(map, i, j, i, j + 1);
ans = Math.max(ans, calcScore(map));
swapCandy(map, i, j, i, j + 1);
}
// swap below
if (i + 1 < N) {
swapCandy(map, i, j, i + 1, j);
ans = Math.max(ans, calcScore(map));
swapCandy(map, i, j, i + 1, j);
}
}
System.out.println(ans);
}
}
'Problem Solving > 구현' 카테고리의 다른 글
BOJ1730 판화 (R) (0) | 2024.01.31 |
---|---|
BOJ10250 ACM 호텔 (0) | 2024.01.31 |
BOJ11068 회문인수 (1) | 2024.01.30 |
BOJ11005 진법변환2 (0) | 2024.01.30 |
BOJ10448 유레카이론* (1) | 2024.01.30 |