본문 바로가기
☃️ Study/C++

[C++] 백준 14500번

by 서나하 2023. 3. 31.

테트로미노 👾

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다.

👀  정사각형은 서로 겹치면 안 된다.

👃🏻  도형은 모두 연결되어 있어야 한다.

👅  정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다.

정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 5가지 모양이 있다.

아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누어져 있으며, 각각의 칸에는 정수가 하나 쓰여 있다. 테트로미노 하나를 적절히 놓아서 테트로미노가 놓인 칸에 쓰여 있는 수들의 합을 최대로 하는 프로그램을 작성하시오. 테트로미노는 반드시 한 정사각형이 정확히 하나의 칸을 포함하도록 놓아야 하며, 회전이나 대칭을 시켜도 된다~.~

 

main.cpp

//
//  main.cpp
//  Implementation
//
//  Created by Sun on 2023/03/30.
//

#include <iostream>
#include <algorithm>	// for max...

int maxElem(int row, int col, int *ptrArr) {    // 2차원 배열 ~x~의 최댓값 반환
    int maxVal = 0;

    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++)
            maxVal = std::max(maxVal, *((ptrArr + i * col) + j));
        
    return maxVal;
}

int main(int argc, const char * argv[]) {

    int N, M;
    std::cin >> N >> M;

    int paper[N][M];    // 종이에 적힌 수
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            std::cin >> paper[i][j];
        }
    }

    // 4x1 filter
    int fourXone[N-4+1][M-1+1];
    for (int i = 0; i < N-4+1; i++) {
        for (int j = 0; j < M-1+1; j++) {
            fourXone[i][j] = 0;
            for (int k = 0; k < 4; k++)
                fourXone[i][j] += paper[i+k][j];
        }
    }
    // 1x4 filter
    int oneXfour[N-1+1][M-4+1];
    for (int i = 0; i < N-1+1; i++) {
        for (int j = 0; j < M-4+1; j++) {
            oneXfour[i][j] = 0;
            for (int k = 0; k < 4; k++)
                oneXfour[i][j] += paper[i][j+k];
        }
    }
    // 2x3 filter
    int twoXthree[N-2+1][M-3+1];
    for (int i = 0; i < N-2+1; i++) {
        for (int j = 0; j < M-3+1; j++) {
            twoXthree[i][j] = 0;
            int W3 = 0, S1 = 0, W1 = 0, S3 = 0;     // WASD 기준 n칸 -> Xn
            for (int m = 0; m < 3; m++) {
                W3 += paper[i][j+m];                   // 3칸 모두 포함
                S1 = std::max(S1, paper[i+1][j+m]);     // max 1칸 포함
                W1 = std::max(W1, paper[i][j+m]);
                S3 += paper[i+1][j+m];
            }
            int ZorO = paper[i][j+1] + paper[i+1][j+1];     // Z모양 or ㅁ모양
            ZorO += std::max(paper[i][j], paper[i][j+2]);     // 가운데 블록은 무조건 포함
            ZorO += std::max(paper[i+1][j], paper[i+1][j+2]);   // 나머지 중에 선택
            
            twoXthree[i][j] = std::max({W3+S1, W1+S3, ZorO});
        }
    }
    // 3x2 filter
    int threeXtwo[N-3+1][M-2+1];
    for (int i = 0; i < N-3+1; i++) {
        for (int j = 0; j < M-2+1; j++) {
            threeXtwo[i][j] = 0;
            int A3 = 0, D1 = 0, A1 = 0, D3 = 0;     // WASD 기준 n칸 -> Xn
            for (int m = 0; m < 3; m++) {
                A3 += paper[i+m][j];
                D1 = std::max(D1, paper[i+m][j+1]);
                A1 = std::max(A1, paper[i+m][j]);
                D3 += paper[i+m][j+1];
            }
            int ZorO = paper[i+1][j] + paper[i+1][j+1];     // Z모양 or ㅁ모양
            ZorO += std::max(paper[i][j], paper[i+2][j]);
            ZorO += std::max(paper[i][j+1], paper[i+2][j+1]);
            
            threeXtwo[i][j] = std::max({A3+D1, A1+D3, ZorO});
        }
    }
    
    std::cout << std::max({maxElem(N-3+1, M-2+1, (int*)threeXtwo),
                        maxElem(N-2+1, M-3+1, (int*)twoXthree),
                        maxElem(N-4+1, M-1+1, (int*)fourXone),
                        maxElem(N-1+1, M-4+1, (int*)oneXfour)}) << std::endl;

    return 0;
}

꺅ㄱ
어떤 4개를 골라도 연결"이라는 건 오타고... 안되는 모양이 이씀

 

2차원 배열을 함수에 전달하고 싶다,,,,는 심플한 요구가 오늘따라 넘 어려워서.......2차원 배열 포인터와 포인터 배열을 이해하기 위해 한 100개가 넘는 글들을 본 것 같다. 그 중 도움이 됐거나 될 예정인 것들.......

 

이차원배열을 매개변수로 넣어주기 (passing a 2d array as a function argument)

2차원 배열을 선언 후 함 수 이자로 넘겨줄 필요가 있는 경우 int printArr(int** arr){ int i, j; for (i = 0; i < 5; i++){ for (j = 0; j < 5; j++) printf("%d\t", arr[i][j]); printf("\n"); } return 0; } int main(){ int a[3][4] = { { 1, 2,

hyem2.tistory.com

 

Correct way of passing 2 dimensional array into a function

I have a 2-dimensional array and I am passing it into a function to carry out certain operations. I'd like to know the correct way of doing it... #define numRows 3 #define numCols 7 #define Total...

stackoverflow.com

 

진짜 이차원배열처럼 malloc하는 방법

이차원배열을 어떻게 malloc하느냐는 질문을 받았는데, 쉽지 않은 주제네요. 이차원 배열을 함수 매개변수로 넘기는 방법을 먼저 살펴보겠습니다. C 언어에서 2차원 배열은 포인터의 배열이고 각

plas.tistory.com

 

C++ 2차원 포인터(포인터의 포인터)를 이용한 2차원 배열 다루기

본 프로그램은 n명의 학생 각각이 m개의 과목을 수강할 경우에 대한 2차원 배열을 선언하는 형태인데 학생 수가 고정되어 있지 않고 가변이고 각 학생의 수강 과목도 고정되어 있지 않고 각각 상

developer-joe.tistory.com

일단 구현(브루트포스...)유형답게 풀긴했는데 넘 노가다 느낌이 강해서 나중에 dfs로 다시 풀어보도록 하겠당~

'☃️ Study > C++' 카테고리의 다른 글

[C++] 백준 2193번  (1) 2023.07.16
[C++] 백준 1463번  (0) 2023.07.16
[C++] 백준 2606번  (0) 2023.04.08
[C++] 백준 1018번  (0) 2023.03.27
[C++] 백준 11047번  (0) 2023.03.26

댓글