[BOJ] 14500 : 테트로미노

14500 : 테트로미노

풀이

시뮬레이션

삼성기출 변형문제.

(소스코드 눈어지러움 주의)

좌표마다 숫자가 있는데 합이 가장큰 숫자를 찾는 문제이다.

모든 좌표를 한번 순회하면서 좌표마다 가능한 테트리스블록(19개)의 합을 구해서 갱신했다.

가능한 블록을 쭉 그려본다음 그냥 sum=첫번째 두번쨰 세번쨰 네번째 이렇게 구했다.

그런데 좌표가 튀어나가는 예외처리를 해야되는데 상당히 귀찮아서 특수한 방법을 사용했다.

좌표를 주어진 최대사이즈인 500이 아니라 왼쪽+3 오른쪽+3 위+3 아래+3 크게 잡은뒤,

제일 처음에 좌표를 아주큰 음수로 초기화했다. (최대 많이 튀어나가봤자 3개 튀어나갈것이므로)

그래서 만약에 좌표를 튀어나간값이 있다면 음수가 될것이므로 최대값에 포함되지 않게 했다.

오늘, 좀 똑똑했다 (뿌듯)

코드

#include <iostream>
#include <queue>
#include <deque>
#include <vector>
#include <cstring>
using namespace std;
int arr[506][506];

//1 : 일자 2종류
//2 : 네모 1종류
//3 : L자 8종류
//4 : 꼬불이 4종류
//5 : 뻐큐 4종류
//총 19종류
int go(int i,int j,int type) {
    int sum = 0;
    if (type == 0) {
        sum = arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i][j + 3];
    }
    else if (type == 1) {
        sum = arr[i][j] + arr[i + 1][j] + arr[i + 2][j] + arr[i + 3][j];
    }
    else if (type == 2) {
        sum = arr[i][j] + arr[i + 1][j] + arr[i][j+1] + arr[i + 1][j+1];
    }
    else if (type == 3) {
        sum = arr[i][j] + arr[i+1][j] + arr[i+2][j] + arr[i+2][j+1];
    }
    else if (type == 4) {
        sum = arr[i][j] + arr[i][j+1] + arr[i-1][j+1] + arr[i-2][j+1];
    }
    else if (type == 5) {
        sum = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i+2][j+1];
    }
    else if (type == 6) {
        sum = arr[i][j] + arr[i][j-1] + arr[i+1][j-1] + arr[i+2][j-1];
    }
    else if (type == 7) {
        sum = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i-1][j+2];
    }
    else if (type == 8) {
        sum = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+1][j+2];
    }
    else if (type == 9) {
        sum = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+2];
    }
    else if (type == 10) {
        sum = arr[i][j] + arr[i-1][j] + arr[i-1][j+1] + arr[i-1][j+2];
    }
    else if (type == 11) {
        sum = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+2][j+1];
    }
    else if (type == 12) {
        sum = arr[i][j] + arr[i+1][j] + arr[i+1][j-1] + arr[i+2][j-1];
    }
    else if (type == 13) {
        sum = arr[i][j] + arr[i][j+1] + arr[i-1][j+1] + arr[i-1][j+2];
    }
    else if (type == 14) {
        sum = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i+1][j+2];
    }
    else if (type == 15) {
        sum = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i][j+2];
    }
    else if (type == 16) {
        sum = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i-1][j+1];
    }
    else if (type == 17) {
        sum = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+1][j-1];
    }
    else if (type == 18) {
        sum = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+2][j];
    }
    return sum;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int n, m;
    cin >> n >> m;

    //범위체크 하기 귀찮아져서
    //처음에 엄청작은값을 넣어둬서 튀어나가면 알아서 최대값이 안되게한다.
    for (int i = 0; i < 506; i++) {
        for (int j = 0; j < 506; j++) {
            //최대 많이튀어나가면 3개
            arr[i][j] = -700000000;
        }
    }

    for (int i = 3; i < n+3; i++) {
        for (int j = 3; j < m+3; j++) {
            cin >> arr[i][j];
        }
    }
    int ans = 0;
    //1-1
    for (int i = 3; i < n+3; i++) {
        for (int j = 3; j < m+3; j++) {
            int sum = 0;
            for (int k = 0; k < 19; k++) {
                sum = go(i,j,k);
                //cout << "i,j,k,sum : " << i << ' ' << j << ' ' << k << ' ' << sum << '\n';
                if (ans < sum)
                    ans = sum;
            }
        }
    }
    cout << ans;
    return 0;
}
Written on April 12, 2019