알고리즘/백준(BOJ)

백준 - 14500 테트로미노

시나모온 2020. 10. 15. 16:46

문제 링크입니다 : www.acmicpc.net/problem/14500

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변�

www.acmicpc.net

 

데이터는 논리에서 분리한다!

코드는 설계하는 원칙 중 하나이다. 그래서 노가다를 했다!

 

 

 

 

 

 

#include <iostream>
#include <vector>

using namespace std;

vector<vector<vector<int>>> tetromino = {
    {
        {1, 1, 1, 1}
    },
    {
        {1},
        {1},
        {1},
        {1}
    },
    {
        {1, 1},
        {1, 1}
    },
    {
        {1, 1, 1},
        {1, 0, 0}
    },
    {
        {1, 1},
        {0, 1},
        {0, 1}
    },
    {
        {0, 0, 1},
        {1, 1, 1}
    },
    {
        {1, 0},
        {1, 0},
        {1, 1}
    },
    {
        {1, 1, 1},
        {0, 0, 1}
    },
    {
        {0, 1},
        {0, 1},
        {1, 1}
    },
    {
        {1, 0, 0},
        {1, 1, 1}
    },
    {
        {1, 1},
        {1, 0},
        {1, 0}
    },
    {
        {1, 0},
        {1, 1},
        {0, 1},
    },
    {
        {0, 1, 1},
        {1, 1, 0}
    },
    {
        {0, 1},
        {1, 1},
        {1, 0},
    },
    {
        {1, 1, 0},
        {0, 1, 1}
    },
    {
        {1, 1, 1},
        {0, 1, 0}
    },
    {
        {0, 1},
        {1, 1},
        {0, 1}
    },
    {
        {0, 1, 0},
        {1, 1, 1}
    },
    {
        {1, 0},
        {1, 1},
        {1, 0}
    }
};


int main() {
    int N, M;
    cin >> N >> M;

    vector<vector<int>> board(N, vector<int>(M));
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            cin >> board[i][j];
        }
    }

    int max = 0;

    for(int k = 0; k < tetromino.size(); k++) {
        vector<vector<int>>& block = tetromino[k];
        int h = block.size();
        int w = block[0].size();
        for(int i = 0; i < N - h + 1; i++) {
            for(int j = 0; j < M - w + 1; j++) {
                int sum = 0;
                for(int s = 0; s < h; s++) {
                    for(int t = 0; t < w; t++) {
                        sum += board[i + s][j + t] * block[s][t];
                    }
                }
                if(sum > max) {
                    max = sum;
                }
            }
        }
    }

    cout << max;

    return 0;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~