[BOJ] 25682번 | 체슀판 λ‹€μ‹œ μΉ ν•˜κΈ° 2 (C++)

2023. 8. 29. 16:19ㆍCoding Test/BOJ

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

25682번: 체슀판 λ‹€μ‹œ μΉ ν•˜κΈ° 2

첫째 쀄에 μ •μˆ˜ N, M, Kκ°€ 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” λ³΄λ“œμ˜ 각 ν–‰μ˜ μƒνƒœκ°€ 주어진닀. BλŠ” 검은색이며, WλŠ” 흰색이닀.

www.acmicpc.net

 

πŸ§‘πŸ»‍πŸ’»ν’€μ΄ κ³Όμ •

  1. 각각 Nν–‰ Mμ—΄ 크기의 ν°μƒ‰μœΌλ‘œ μ‹œμž‘ν•˜λŠ” λ³΄λ“œνŒκ³Ό κ²€μ€μƒ‰μœΌλ‘œ μ‹œμž‘ν•˜λŠ” λ³΄λ“œνŒ λ‘ 개의 2차원 배열을 μ€€λΉ„ν•©λ‹ˆλ‹€.
  2. λ‹€μŒ 과정을 톡해, ꡐ체해야 ν•˜λŠ” 횟수λ₯Ό λˆ„μ ν•˜μ—¬ μ €μž₯ν•΄ λ‚˜κ°‘λ‹ˆλ‹€.
    • λ‹€μŒμ€ μ˜¬λ°”λ₯Έ 체슀판의 배열일 경우λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
      • (ν–‰ + μ—΄)이 짝수일 경우, μ‹œμž‘ 색깔(1, 1)κ³Ό κ°™μ•„μ•Ό ν•œλ‹€.
      • (ν–‰ + μ—΄)이 ν™€μˆ˜μΌ 경우, μ‹œμž‘ 색깔(1, 1)κ³Ό 달라야 ν•œλ‹€.
      • μœ„ 두 가지 쀑 ν•˜λ‚˜μ— ν•΄λ‹Ήν•˜μ§€ μ•Šμ„ 경우, 색깔을 ꡐ체해야 ν•œλ‹€.
  3. ν–‰κ³Ό 열을 각각 KλΆ€ν„° μ‹œμž‘ν•˜μ—¬, 각각 N, M보닀 μž‘κ±°λ‚˜ 같을 λ•ŒκΉŒμ§€ 2쀑 for 문을 λŒλ €κ°€λ©° λ‹€μŒμ„ ν™•μΈν•©λ‹ˆλ‹€.
    • K x K 크기의 λ³΄λ“œμ—μ„œ 색깔 λ³€κ²½ 횟수λ₯Ό μ–»λŠ” 방법은 πŸ”—2차원 λ°°μ—΄μ—μ„œ λˆ„μ ν•©μ„ μ–»λŠ” 방식과 κ°™μŠ΅λ‹ˆλ‹€.
    • ν°μƒ‰μœΌλ‘œ μ‹œμž‘ν•˜λŠ” λ³΄λ“œνŒμ—μ„œ κ΅¬ν•œ νšŸμˆ˜μ™€ κ²€μ€μƒ‰μœΌλ‘œ μ‹œμž‘ν•˜λŠ” λ³΄λ“œνŒμ—μ„œ κ΅¬ν•œ 횟수 쀑 μž‘μ€ 것을 좜λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

βœοΈμ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

#include <iostream>
#include <vector>
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
using namespace std;
using Board = vector<vector<int>>;
const char WHITE_COLOR = 'W';
const char BLACK_COLOR = 'B';

bool ShouldChangeColor(const char startColor, const char inputColor, const int row, const int col)
{
    bool isEven = (row + col) % 2 == 0;

    // (ν–‰ + μ—΄)이 짝수라면, μ‹œμž‘ 색(1, 1)κ³Ό κ°™μ•„μ•Ό μ˜¬λ°”λ₯Έ λ³΄λ“œνŒμ΄ λœλ‹€.
    if (isEven && startColor == inputColor)
        return false;

    // (ν–‰ + μ—΄)이 ν™€μˆ˜λΌλ©΄, μ‹œμž‘ 색(1, 1)κ³Ό 달라야 μ˜¬λ°”λ₯Έ λ³΄λ“œνŒμ΄ λœλ‹€.
    else if (!isEven && startColor != inputColor)
        return false;
    return true;
}

int main()
{
    FAST_IO;

    int N, M, K;
    cin >> N >> M >> K;

    Board whiteStartBoard(N + 1, vector<int>(M + 1));
    Board blackStartBoard(N + 1, vector<int>(M + 1));

    for (int row = 1; row <= N; row++)
    {
        for (int col = 1; col <= M; col++)
        {
            char color;
            cin >> color;

            bool isChangedInWhiteBoard = ShouldChangeColor(WHITE_COLOR, color, row, col);
            bool isChangedInBlackBoard = ShouldChangeColor(BLACK_COLOR, color, row, col);

            // 이전 λˆ„μ ν•© + μƒˆλ‘œμš΄ κ°’
            whiteStartBoard[row][col] = whiteStartBoard[row - 1][col] + whiteStartBoard[row][col - 1] - whiteStartBoard[row - 1][col - 1] + isChangedInWhiteBoard;
            blackStartBoard[row][col] = blackStartBoard[row - 1][col] + blackStartBoard[row][col - 1] - blackStartBoard[row - 1][col - 1] + isChangedInBlackBoard;
        }
    }

    int answerInWhiteBoard = 1000000000;
    int answerInBlackBoard = 1000000000;

    for (int row = K; row <= N; row++)
    {
        for (int col = K; col <= M; col++)
        {
            int minInWhiteBoard = whiteStartBoard[row][col] - whiteStartBoard[row - K][col] - whiteStartBoard[row][col - K] + whiteStartBoard[row - K][col - K];
            int minInBlackBoard = blackStartBoard[row][col] - blackStartBoard[row - K][col] - blackStartBoard[row][col - K] + blackStartBoard[row - K][col - K];

            answerInWhiteBoard = min(answerInWhiteBoard, minInWhiteBoard);
            answerInBlackBoard = min(answerInBlackBoard, minInBlackBoard);
        }
    }

    cout << min(answerInWhiteBoard, answerInBlackBoard);
    return 0;
}

 

728x90
λ°˜μ‘ν˜•