골랜디 #5 14500번

Published at: 2025-03-24

Last modified at: 2025-03-24

오늘 푼 문제

안녕하세요 한라나입니다.
오늘은 사실 깜빡하고 있었습니다.
근데 자려고 누워서 코찜질을 하다 보니 골랜디 생각이 나는거에요?
던질까 생각도 해봤는데 작심사일은 좀 아닌 것 같아서 다시 일어났습니다.
일어나는 김에 날짜 표시도 00:00:00은 없애버렸습니다.

14500

브루트포스 구현이라니…. 어제 살살 해줬다고 오늘 뚜들겨 패네요.

브루트포스인 만큼 그냥 ‘다’ 해 보면 됩니다. 다만 어떤걸 해봐야 하는지는 알아야겠죠.

모양이 다른 테트로미노는 총 19개가 있습니다. 직선이 두 개, 정사각형은 한 개, 그리고 L 4가지 방향, J 4가지 방향, ㅗ 4가지 방향과 s, z 각각 두 가지 방향입니다.

저는 직선, 정사각형은 따로 하고, 2*3모양과 3*2모양을 분류해서 했습니다.
각각 8가지씩 있는데요, 네 가지 숫자를 더하는건 항상 똑같으니까 왼쪽 위 칸을 기준으로 어느 위치에 있는 네 가지 칸을 더해야 하는지 배열을 만들었습니다.

int shapes2by3[8][4][2] = {
    { {0, 0}, {0, 1}, {0, 2}, {1, 1} },
    { {1, 0}, {1, 1}, {1, 2}, {0, 1} },
    { {0, 0}, {0, 1}, {0, 2}, {1, 0} },
    { {1, 0}, {1, 1}, {1, 2}, {0, 2} },
    { {0, 0}, {1, 0}, {1, 1}, {1, 2} },
    { {0, 0}, {0, 1}, {0, 2}, {1, 2} },
    { {1, 0}, {1, 1}, {0, 1}, {0, 2} },
    { {0, 0}, {0, 1}, {1, 1}, {1, 2} }
};
int shapes3by2[8][4][2] = {
    { {0, 1}, {1, 1}, {2, 1}, {1, 0} },
    { {0, 0}, {1, 0}, {2, 0}, {1, 1} },
    { {0, 0}, {1, 0}, {2, 0}, {2, 1} },
    { {0, 0}, {0, 1}, {1, 1}, {2, 1} },
    { {2, 0}, {0, 1}, {1, 1}, {2, 1} },
    { {0, 0}, {1, 0}, {2, 0}, {0, 1} },
    { {2, 0}, {1, 0}, {1, 1}, {0, 1} },
    { {0, 0}, {1, 0}, {1, 1}, {2, 1} }
};

완전… 노가다죠… 허…
그 다음부터는 ‘왼쪽 위 지점’으로 가능한 모든 점에 대해 저것들을 사용해서 네 가지 숫자를 더한 값이 기존 ans보다 크면 바꾸고를 끝까지 반복하면 됩니다.

for(i=0;i<n-1;i++) {
    for(j=0;j<m-2;j++) {
        int k;
        for(k=0;k<8;k++) {
            ans = max(ans, numbers[i+shapes2by3[k][0][0]][j+shapes2by3[k][0][1]]+numbers[i+shapes2by3[k][1][0]][j+shapes2by3[k][1][1]]+numbers[i+shapes2by3[k][2][0]][j+shapes2by3[k][2][1]]+numbers[i+shapes2by3[k][3][0]][j+shapes2by3[k][3][1]]);
        }
    }
}
//이건 2*3일때

이거보다 더 나은 방법이 있을런지… 있어도 전 안 찾을래요. 미쳐버린거냐.

어쩌면 골드의 기준은 어려움이라기보다는 뭣같음이 아닐까 생각이 드는 요즘입니다. 이걸 2만 6천 800명이나 풀었어요. 그것도 놀랍네요.

ac

감사합니다.

streak


전체 코드

#include <stdio.h>

//using namespace std;

int max(int a, int b) {
    if(a>b) return a;
    else return b;
}

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    int i, j;
    int numbers[550][550];
    for(i=0;i<n;i++) {
        for(j=0;j<m;j++) {
            scanf("%d", &numbers[i][j]);
        }
    }
    int ans = 0;
    //straight
    for(i=0;i<n-3;i++) {
        for(j=0;j<m;j++) {
            ans = max(ans, numbers[i][j]+numbers[i+1][j]+numbers[i+2][j]+numbers[i+3][j]);
        }
    }
    for(i=0;i<n;i++) {
        for(j=0;j<m-3;j++) {
            ans = max(ans, numbers[i][j]+numbers[i][j+1]+numbers[i][j+2]+numbers[i][j+3]);
        }
    }
    //square
    for(i=0;i<n-1;i++) {
        for(j=0;j<m-1;j++) {
            ans = max(ans, numbers[i][j]+numbers[i][j+1]+numbers[i+1][j]+numbers[i+1][j+1]);
        }
    }
    //2*3
    int shapes2by3[8][4][2] = {
        { {0, 0}, {0, 1}, {0, 2}, {1, 1} },
        { {1, 0}, {1, 1}, {1, 2}, {0, 1} },
        { {0, 0}, {0, 1}, {0, 2}, {1, 0} },
        { {1, 0}, {1, 1}, {1, 2}, {0, 2} },
        { {0, 0}, {1, 0}, {1, 1}, {1, 2} },
        { {0, 0}, {0, 1}, {0, 2}, {1, 2} },
        { {1, 0}, {1, 1}, {0, 1}, {0, 2} },
        { {0, 0}, {0, 1}, {1, 1}, {1, 2} }
    };
    for(i=0;i<n-1;i++) {
        for(j=0;j<m-2;j++) {
            int k;
            for(k=0;k<8;k++) {
                ans = max(ans, numbers[i+shapes2by3[k][0][0]][j+shapes2by3[k][0][1]]+numbers[i+shapes2by3[k][1][0]][j+shapes2by3[k][1][1]]+numbers[i+shapes2by3[k][2][0]][j+shapes2by3[k][2][1]]+numbers[i+shapes2by3[k][3][0]][j+shapes2by3[k][3][1]]);
            }
        }
    }
    //3*2
    int shapes3by2[8][4][2] = {
        { {0, 1}, {1, 1}, {2, 1}, {1, 0} },
        { {0, 0}, {1, 0}, {2, 0}, {1, 1} },
        { {0, 0}, {1, 0}, {2, 0}, {2, 1} },
        { {0, 0}, {0, 1}, {1, 1}, {2, 1} },
        { {2, 0}, {0, 1}, {1, 1}, {2, 1} },
        { {0, 0}, {1, 0}, {2, 0}, {0, 1} },
        { {2, 0}, {1, 0}, {1, 1}, {0, 1} },
        { {0, 0}, {1, 0}, {1, 1}, {2, 1} }
    };
    for(i=0;i<n-2;i++) {
        for(j=0;j<m-1;j++) {
            int k;
            for(k=0;k<8;k++) {
                ans = max(ans, numbers[i+shapes3by2[k][0][0]][j+shapes3by2[k][0][1]]+numbers[i+shapes3by2[k][1][0]][j+shapes3by2[k][1][1]]+numbers[i+shapes3by2[k][2][0]][j+shapes3by2[k][2][1]]+numbers[i+shapes3by2[k][3][0]][j+shapes3by2[k][3][1]]);
            }
        }
    }
    printf("%d", ans);
    return 0;
}

여기서 {{ 쓰면 오류나네요… 이스케이프 시켜줘야하네요 다…
아니 근데 생각해보니까 다 닫혀 있잖아 근데 왜 안닫혀있다고 오류가 나


Copyright © 2025- HanLana18. Some rights reserved.

Page last modified: 2025-03-24.