[BOJ] 2630번 | 색쒅이 λ§Œλ“€κΈ° (C++)

2023. 8. 31. 20:31ㆍCoding Test/BOJ

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

2630번: 색쒅이 λ§Œλ“€κΈ°

첫째 μ€„μ—λŠ” 전체 μ’…μ΄μ˜ ν•œ λ³€μ˜ 길이 N이 μ£Όμ–΄μ Έ μžˆλ‹€. N은 2, 4, 8, 16, 32, 64, 128 쀑 ν•˜λ‚˜μ΄λ‹€. μƒ‰μ’…μ΄μ˜ 각 κ°€λ‘œμ€„μ˜ μ •μ‚¬κ°ν˜•μΉΈλ“€μ˜ 색이 μœ—μ€„λΆ€ν„° μ°¨λ‘€λ‘œ λ‘˜μ§Έ 쀄뢀터 λ§ˆμ§€λ§‰ μ€„κΉŒμ§€ 주어진닀.

www.acmicpc.net

 

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

맨 μ²˜μŒμ—λŠ” \( N \times N \) 크기의 색쒅이뢀터 μ‹œμž‘ν•˜μ—¬ 주어진 μ •μ‚¬κ°ν˜• λ‚΄μ˜ 색깔듀이 λͺ¨λ‘ 같은 색깔인지λ₯Ό λ³Ό κ²λ‹ˆλ‹€. 이 λ•Œ, μ„ νƒμ§€λŠ” 두 κ°€μ§€λ‘œ λ‚˜λ‰˜κ²Œ λ©λ‹ˆλ‹€.

  1. 주어진 λ²”μœ„ λ‚΄μ˜ 색깔이 λͺ¨λ‘ 같은가?  \( \rightarrow \)  ν•΄λ‹Ή 색깔 개수 +1ν•˜κ³ , μ’…λ£Œ
  2. 색깔이 같지 μ•Šμ€κ°€?  \( \rightarrow \)  주어진 λ²”μœ„μ˜ μ‚¬κ°ν˜•μ„ 4λ“±λΆ„ν•˜μ—¬ λ‹€μ‹œ 탐색 μ‹œμž‘

 

μ •μ‚¬κ°ν˜• 탐색은 맨 μ™Όμͺ½ μœ„λΆ€ν„° μ—΄ λ°©ν–₯으둜 μ‹œμž‘ν•  것이며, 이 μ‹œμž‘ μ§€μ μ˜ ν–‰, 열을 (rowBegin, colBegin)이라고 ν•©μ‹œλ‹€.

ν•΄λ‹Ή μ •μ‚¬κ°ν˜• λ‚΄μ˜ 색깔이 λͺ¨λ‘ 같은 1번 μΌ€μ΄μŠ€μ˜ κ²½μš°μ—λŠ” ν•΄λ‹Ή 색깔 개수λ₯Ό +1 ν•΄μ£Όκ³  끝내면 λ©λ‹ˆλ‹€.

 

 

ν•˜μ§€λ§Œ, 2번 μΌ€μ΄μŠ€μ— ν•΄λ‹Ήν•˜λŠ” κ²½μš°μ—λŠ” N을 반으둜 λ‚˜λˆˆ 후에 λ‹€μ‹œ 탐색을 μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

N을 반으둜 λ‚˜λˆˆ λ‹€μŒ νƒμƒ‰μ—μ„œμ˜ I, II, III, IV의 rowBegin, colBegin 값듀은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

(rowBegin, colBegin)                      // I
(rowBegin, colBegin + (N / 2))            // II
(rowBegin + (N / 2), colBegin)            // III
(rowBegin + (N / 2), colBegin + (N / 2))  // IV

 

μœ„μ˜ ν–‰, 열을 μ‹œμž‘μ μœΌλ‘œ ν•˜μ—¬ 각각의 μ˜μ—­μ—μ„œ 탐색을 μ‹œμž‘ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

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

#include <iostream>
#include <vector>
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
using namespace std;
using Square = vector<vector<int>>;
using Line = vector<int>;

void Search(const Square& coloredPaper, vector<int>& counts, int N, int rowBegin, int colBegin)
{
    if (N == 1)
    {
        int color = coloredPaper[rowBegin][colBegin];
        counts[color]++;
        return;
    }

    int color = -1;
    bool isAllEqaul = true;
    for(int row = rowBegin; row < rowBegin + N; row++)
    {
        for (int col = colBegin; col < colBegin + N; col++)
        {
            // 첫 λΆ€λΆ„ 색깔 μ–»κΈ°
            if (row == rowBegin && col == colBegin)
            {
                color = coloredPaper[row][col];
                continue;
            }

            // μ˜μ—­ 내에 색깔이 λ‹€λ₯Έ 게 μžˆμ„ 경우, 반볡문 μ’…λ£Œ
            if (color != coloredPaper[row][col])
            {
                isAllEqaul = false;
                break;
            }
        }

        if (!isAllEqaul)
            break;
    }


    // μ˜μ—­ λ‚΄μ˜ 색깔이 λͺ¨λ‘ 같을 경우, ν•΄λ‹Ή 색깔 개수 +1
    if (color != -1 && isAllEqaul)
    {
        counts[color]++;
        return;
    }

    int next = N / 2;
    Search(coloredPaper, counts, next, rowBegin, colBegin);                 // I
    Search(coloredPaper, counts, next, rowBegin, colBegin + next);          // II
    Search(coloredPaper, counts, next, rowBegin + next, colBegin);          // III
    Search(coloredPaper, counts, next, rowBegin + next, colBegin + next);   // IV
}


int main()
{
    FAST_IO;

    int N;
    cin >> N;

    Square coloredPaper(N, Line(N));
    for (int i = 0; i < N; i++)
        for (int k = 0; k < N; k++)
            cin >> coloredPaper[i][k];

    vector<int> counts { 0, 0 };
    Search(coloredPaper, counts, N, 0, 0);

    for (const auto& color : counts)
        cout << color << "\n";
    return 0;
}

 

728x90
λ°˜μ‘ν˜•