백준 - JAVA

3085번 : 사탕 게임

uhyvn 2023. 8. 21. 16:55

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;

public class p3085 {

    static int max = 1; // 최솟값
    static int n;
    static char[][] board; // 보드판 생성

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        board = new char[n][n];

        for (int i = 0; i < n; i++) {
            String s = br.readLine();
            for (int j = 0; j < n; j++) {
                board[i][j] = s.charAt(j); // 보드판에 입력값 넣기 (보드판 채우기)
            }
        }

		// 열마다 왼쪽에서 오른쪽으로만 탐색 (오른쪽 색상과 현재 색상 교환 후 돌려놓기)
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n - 1; j++) {
                swap(i, j, i, j + 1); // 오른쪽 색상과 교환
                search(); // 바뀐 보드에서 최댓값 검색
                swap(i, j + 1, i, j); // 교환한 색상 원상태로 돌려놓기
            }
        }
        
		// 행마다 위쪽에서 아래쪽으로만 탐색 (아래쪽 색상과 현재 색상 교환 후 돌려놓기)
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n; j++) {
                swap(i, j, i + 1, j); // 아래쪽 색상과 교환
                search(); // 바뀐 보드에서 최댓값 검색
                swap(i + 1, j, i, j); // 교환한 색상 원상태로 돌려놓기
            }
        }

        System.out.println(max); // 최댓값(정답) 출력
    }

	// 사탕 교환 메서드
    public static void swap(int x1, int y1, int x2, int y2) {

        char temp = board[x1][y1];
        board[x1][y1] = board[x2][y2];
        board[x2][y2] = temp;
    }

	// 바뀐 보드에서 최댓값 검색 메서드
    public static void search() {

		// 행 기준 검색
        for (int i = 0 ; i < n; i ++) {
            int count = 1; // 최솟값(현재 기준이 되는 색상 1개)

            for (int j = 0; j < n - 1; j++) {

			// 같은 색상이면 카운트 후 최댓값 업데이트
                if (board[i][j] == board[i][j + 1]) {
                    count++;
                    max = Math.max(count, max);
                } else {
                    count = 1;
                }
            }
        }

		// 열 기준 검색
        for (int i = 0 ; i < n; i ++) {
            int count = 1;

            for (int j = 0; j < n - 1; j++) {
                if (board[j][i] == board[j + 1][i]) {
                    count++;
                    max = Math.max(count, max);
                } else {
                    count = 1;
                }
            }
        }

    }

}