πŸ’­ Problem Solving

[BOJ][C++] λ°±μ€€ 3085번: 사탕 κ²Œμž„

0=2. 2024. 10. 30. 17:18

문제

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

 

문제 이해

  • N×N 크기의 λ³΄λ“œμ— 사탕을 4가지 μƒ‰μœΌλ‘œ μ±„μ›Œμ Έμžˆλ‹€.
  • μΈμ ‘ν•œ 두 칸을 골라 사탕을 μ„œλ‘œ κ΅ν™˜ν•œλ‹€.
  • ν–‰ λ˜λŠ” μ—΄μ—μ„œ 같은 μƒ‰μœΌλ‘œ 이루어져 μžˆλŠ” κ°€μž₯ κΈ΄ 연속 뢀뢄을 κ΅¬ν•œλ‹€.

 

문제 풀이

πŸ” μ ‘κ·Ό

λͺ¨λ“  경우의 수λ₯Ό νƒμƒ‰ν•˜λŠ” μ‹œκ°„λ³΅μž‘λ„λ₯Ό 계산해보면,

사탕을 κ΅ν™˜ν•˜λŠ” 데 N * N, μ—°μ†ν•˜λŠ” μ΅œλŒ€ 개수λ₯Ό κ΅¬ν•˜λŠ” 데 N * N μ΄λ―€λ‘œ μ΄ O(N^4)이닀.

N ≤ 50μ΄λ―€λ‘œ μ œν•œμ‹œκ°„ 내에 계산할 수 μžˆλ‹€.

 

πŸ’‘ 브루트포슀

  1. ν–‰/μ—΄μ—μ„œ μΈμ ‘ν•œ 두 칸을 골라 μ„œλ‘œ 사탕을 κ΅ν™˜ν•œλ‹€.
  2. μ—°μ†ν•˜λŠ” ν–‰/μ—΄μ˜ μ΅œλŒ€ 개수λ₯Ό μ°ΎλŠ”λ‹€.
    1회 κ΅ν™˜ν•  λ•Œλ§ˆλ‹€ μ΅œλŒ€ 개수λ₯Ό μ°ΎλŠ”λ‹€.

 

μ½”λ“œ

#include <iostream>
#include <vector>

using namespace std;

/*
1. ν–‰/μ—΄μ—μ„œ μΈμ ‘ν•œ 두 칸을 골라 μ„œλ‘œ 사탕을 κ΅ν™˜ν•œλ‹€.
2. μ—°μ†ν•˜λŠ” ν–‰/μ—΄μ˜ μ΅œλŒ€ 개수λ₯Ό μ°ΎλŠ”λ‹€.
*/

int checkMax(int n, vector<vector<char>> &board) {
    int cnt, ret = 1;

    // ν–‰μ—μ„œ 연속 개수
    for (int i = 0; i < n; i++) {
        cnt = 1;
        for (int j = 1; j < n; j++) {
            if (board[i][j] == board[i][j - 1]) cnt++;
            else cnt = 1;
            ret = max(cnt, ret);
        }
    }

    // μ—΄μ—μ„œ 연속 개수
    for (int j = 0; j < n; j++) {
        cnt = 1;
        for (int i = 1; i < n; i++) {
            if (board[i][j] == board[i - 1][j]) cnt++;
            else cnt = 1;
            ret = max(cnt, ret);
        }
    }

    return ret;
}

int swapCandy(int n, vector<vector<char>> &board) {
    int ans = 0;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // ν–‰ 탐색
            if (j < n - 1) {
                swap(board[i][j], board[i][j + 1]);
                ans = max(ans, checkMax(n, board));
                swap(board[i][j], board[i][j + 1]);
            }

            // μ—΄ 탐색
            if (i < n - 1) {
                swap(board[i][j], board[i + 1][j]);
                ans = max(ans, checkMax(n, board));
                swap(board[i][j], board[i + 1][j]);
            }
        }
    }

    return ans;
}

int main() {
    int n;

    cin >> n;
    vector<vector<char>> board(n, vector<char>(n));

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> board[i][j];
        }
    }

    cout << swapCandy(n, board);

    return 0;
}