in.add()

[3085] 사탕 게임 본문

Algorithm/BOJ

[3085] 사탕 게임

idan 2021. 9. 9. 23:25

문제 링크 : https://www.acmicpc.net/problem/3085

 

3085번: 사탕 게임

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

www.acmicpc.net

 

문제 해결 방법

완전 탐색으로 오른쪽 사탕과 바꿨을 때, 아래 사탕과 바꿨을 때 최대 연속된 개수를 구하는 방법으로 구현했다.

 

import java.util.Scanner;

public class Main {
    static char[][] candies;

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        candies = new char[N][N];

        sc.nextLine();
        for (int i = 0; i < N; i++) {
            candies[i] = sc.nextLine().toCharArray();
        }

        int max = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (j < N - 1) {
                    swapRight(i, j); // 오른쪽 사탕과 바꿈
                    int result = count(); // 숫자 세기
                    max = Math.max(max, result);
                    swapRight(i, j); // 원래대로
                }
                if (i < N - 1) {
                    swapDown(i, j); // 아래 사탕과 바꿈
                    int result = count(); // 숫자 세기
                    max = Math.max(max, result);
                    swapDown(i, j); // 원래대로
                }
            }
        }
        System.out.println(max);
    }

    public static int count() { // 가장 긴 연속된 사탕 수 찾기
        int n = candies.length;
        int result = 1;
        for (int i = 0; i < n; i++) {
            int cnt = 1;
            for (int j = 0; j < n - 1; j++) {
                if (candies[i][j] == candies[i][j + 1]) {
                    cnt++;
                } else {
                    cnt = 1;
                }
                result = Math.max(result, cnt);
            }

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

    public static void swapRight(int i, int j) {
        if (!(candies[i][j] == candies[i][j + 1])) {
            char tmp = candies[i][j];
            candies[i][j] = candies[i][j + 1];
            candies[i][j + 1] = tmp;
        }
    }

    public static void swapDown(int i, int j) {
        if (!(candies[i][j] == candies[i + 1][j])) {
            char tmp = candies[i][j];
            candies[i][j] = candies[i + 1][j];
            candies[i + 1][j] = tmp;
        }
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

[2116] 주사위 쌓기  (0) 2021.09.11
[2012] 등수 매기기  (0) 2021.09.10
[16236] 아기 상어  (0) 2021.09.04
[14889] 스타트와 링크  (0) 2021.09.03
[1654] 랜선 자르기  (0) 2021.09.02
Comments