ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1451 (직사각형으로 나누기) c++
    백준 문제 2022. 3. 16. 20:42
    728x90

    문제

     

    1451번: 직사각형으로 나누기

    첫째 줄에 직사각형의 세로 크기 N과 가로 크기 M이 주어진다. 둘째 줄부터 직사각형에 들어가는 수가 가장 윗 줄부터 한 줄에 하나씩 M개의 수가 주어진다. N과 M은 50보다 작거나 같은 자연수이

    www.acmicpc.net

    행 n과 열 m이 주어지면 n*m 직사각형을 세등분으로 나누어 세 직사각형 넓이의 곱의 최대를 출력해주면 됩니다.

    각 직사각형의 넓이는 각 직사각형의 포함되는 n*m 이차원 배열의 인덱스 값의 합입니다.

    저는 처음에 생각했을 때 세 직사각형의 넓이의 곱이 최대로 될려면 각 직사각형이 전체 n * m 넓이의 평균에

    가까울 수록 넓이가 커진다고 생각했습니다.

    따라서 1)번으로 생각했습니다.

    1) 모든 수를 더하면서 평균값에 가깝게 직사각형을 묶음

    2) 직사각형을 어떻게 나누는지 구현?

    하지만 2)번에 막혀 버려서 여러 블로그글들을 찾아봤습니다.

     

    관건은 직사각형을 삼등분하는 방법은 총 6가지가 존재 해서 모든 경우의 수를 봐주는 것입니다.

     

    먼저 n*m 직사각형을 삼등분하기 전에 prefix sum방법으로 직사각형의 누적합을 기록하였습니다.

    1~6 번째 줄까지는 입력 부분입니다.

    7~9 번째 줄은 prefix sum 을 처리해 주는 과정입니다.

     

    이제 n * m 직사각형을 삼등분하는 경우의 수입니다.

    1) | |

     

    2) =

     

    3) ㅗ

     

    4) ㅜ

     

    5) ㅏ

     

    6) ㅓ


    전체 코드입니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <string>
    #include <stack>
    #include <queue>
    #include <deque>
    #include <cmath>
    #include <map>
    #include <set>
    #include <tuple>
    #define MAX 2100000000
    using namespace std;
    using ll = long long;
    using ull = unsigned long long;
    int n,m;
    string st;
    int arr[51][51];
    int psum[51][51];
    int main() {
        ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>st;
            for(int j=1;j<=m;j++)
                arr[i][j] = st[j-1- '0';
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                psum[i][j]=psum[i-1][j]+psum[i][j-1]-psum[i-1][j-1]+arr[i][j];
     
        ll ret=0;
        ll s1, s2, s3;
        for(int i=1;i<=m-2;i++){
            for(int j=i+1;j<=m-1;j++){
                s1=psum[n][i];
                s2=psum[n][j]-s1;
                s3=psum[n][m]-(s1+s2);
                ret = max(ret, s1 * s2 * s3);
            }
        }        
        for(int i=1;i<=n-2;i++){
            for(int j=i+1;j<=n-1;j++){
                s1=psum[i][m];
                s2=psum[j][m]-s1;
                s3=psum[n][m]-(s1+s2);
                ret = max(ret, s1 * s2 * s3);
            }
        }    
        for(int i=1;i<=m-1;i++){ //ㅗ
            for(int j=n-1;j>=1;j--){
                s1=psum[n-j][m]-psum[n-j][i];
                s2=psum[n][m]-psum[n-j][m];
                s3=psum[n][m]-(s1+s2);
                ret=max(ret,s1*s2*s3);
            }
        }
        for(int i=1;i<=n-1;i++){ //ㅜ
            for(int j=1;j<=m-1;j++){
                s1=psum[i][m];
                s2=psum[n][j]-psum[i][j];
                s3=psum[n][m]-(s1+s2);
                ret = max(ret, s1 * s2 * s3);
            }
        }
        for(int i=1;i<=m-1;i++){ //ㅏ
            for(int j=1;j<=n-1;j++){
                s1=psum[n][i];
                s2=psum[j][m]-psum[j][i];
                s3=psum[n][m]-(s1+s2);
                ret = max(ret, s1 * s2 * s3);
            }
        }
        for(int i=1;i<=n-1;i++){ //ㅓ
            for(int j=1;j<=m-1;j++){
                s1=psum[n][j]-psum[i][j];
                s2=psum[n][j]-s1;
                s3=psum[n][m]-(s1+s2);
                ret = max(ret, s1 * s2 * s3);
            }
        }
        cout<<ret;
     
     
     
        
        return 0;
    }
     
    cs

    '백준 문제' 카테고리의 다른 글

    백준 10989 (수 정렬하기 3) c++  (0) 2022.07.12
    백준 1436 영화감독 숌 c++  (0) 2022.07.11
    백준 15811 (복면산) c++  (0) 2022.03.06
    백준 1655 (가운데를 말해요) c++  (0) 2022.03.03
    백준 1939 (중량제한) c++  (0) 2022.02.26
Designed by Tistory.