CodingTest/백준

[백준] BOJ 3085 사탕 게임 (실버 2)

브디크리 2024. 4. 11. 23:43

문제


https://www.acmicpc.net/problem/3085

 

3085번: 사탕 게임

예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.

www.acmicpc.net


해설



  1. 현재 위치 (i, j)에서 4방 탐색 (인덱스를 넘어가는 경우 제외) + 다른 색인 경우에 swap
  2. 열 개수 카운팅 :
    현재 위치 (i, j)에서 열 [i][j ~ 0] + [i][j + 1 ~ N]으로 개수 카운팅 (도중에 다른 색이 나오면 break)
  3. 행 개수 카운팅 :
    현재 위치 (i, j)에서 행 [i ~ 0][j] + [i + 1 ~ N][j]으로 개수 카운팅 (도중에 다른 색이 나오면 break)
  4. 개수 카운팅이 끝나면 max 값을 업데이트
  5. 카운팅 과정에서 현재 값을 추가하지 않았기 때문에 + 1로 출력

코드 (브루트 포스)


import java.io.*;

public class Main {
    static StringBuilder sb = new StringBuilder();
    static int N, max = 0;
    static char[][] board;
    static char[][] tmp;
    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.parseInt(br.readLine());
        board = new char[N][N];
        tmp = new char[N][N];

        for (int i = 0; i < N; i++) {
            board[i] = br.readLine().toCharArray();
            for (int j = 0; j < N; j++) {
                tmp[i][j] = board[i][j];
            }
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                calcCnt(i, j, board[i][j]);
                if (i - 1 >= 0 && board[i - 1][j] != board[i][j]) {
                    swap(i, j, i - 1 , j);
                    calcCnt(i, j, board[i][j]);
                    swap(i, j, i - 1 , j);
                }
                if (i + 1 < N && board[i + 1][j] != board[i][j]) {
                    swap(i, j, i + 1 , j);
                    calcCnt(i, j, board[i][j]);
                    swap(i, j, i + 1 , j);
                }
                if (j - 1 >= 0 && board[i][j - 1] != board[i][j]) {
                    swap(i, j, i, j - 1);
                    calcCnt(i, j, board[i][j]);
                    swap(i, j, i, j - 1);
                }
                if (j + 1 < N && board[i][j + 1] != board[i][j]) {
                    swap(i, j, i, j + 1);
                    calcCnt(i, j, board[i][j]);
                    swap(i, j, i, j + 1);
                }
            }
        }
        sb.append(max + 1);
        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }

    private static void calcCnt(int row, int col, char color) {
        int cnt = 0;
        //열 확인
        for (int i = col - 1; i >= 0; i--) {
            if (board[row][i] != color) break;
            cnt++;
        }
        for (int i = col + 1; i < N; i++) {
            if(board[row][i] != color) break;
            cnt++;
        }
        max = Math.max(max, cnt);

        cnt = 0;
        //행 확인
        for (int i = row - 1; i >= 0; i--) {
            if(board[i][col] != color) break;
            cnt++;
        }
        for (int i = row + 1; i < N; i++) {
            if(board[i][col] != color) break;
            cnt++;
        }
        max = Math.max(max, cnt);
    }

    private static void swap(int row1, int col1, int row2, int col2) {
        char temp = board[row1][col1];
        board[row1][col1] = board[row2][col2];
        board[row2][col2] = temp;
    }
}