[C++ / 백준 14391번] 종이 조각

2025. 2. 20. 12:32·프로그래밍 공부/백준 (C++)

문제

 

 

 

 

시행 착오

 

비트마스크 알고리즘을 사용해 문제 풀이가 아직 익숙치 않아 풀이가 오래 걸렸다.

무에서 유를 창조할 수는 없기에 gpt에게 아이디어만 제공받아 풀이를 시작했다.

 

 

해결 방법

 

문제에서의 힌트는 수는 무조건 행렬에서 각각 성분의 크기가 커지는 방향으로 진행된다는 점이다.

따라서 수는 오른쪽, 혹은 아래쪽 으로만 진행하게 된다. 

경우의 수가 2개라는 것은 결국 이진으로 표현이 가능함을 알 수 있었다.

 

배열 3개를 사용했다.

입력받은 수를 저장할 arr

비트마스크를 통한 경우의수를 저장할 binaryarr

방문 여부를 나타내는 visited

 

방문되어있지 않은 이진배열 위치에서 해당 위치의 값이 아닌 값 (연속되지 않을 때까지, 방문 되지 않은 곳으로) 까지 순회하면서 수를 만들고 더해준 다음 최댓값을 구했다. 

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
using namespace std;

int N, M;

int arr[4][4];
int binaryarr[4][4];


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

   
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            scanf("%1d", &arr[i][j]);
        }
    }
 
    // 1이면 오른쪽, 0이면 아래쪽

    int maxresult = 0;
    int num = 0;
    int sum = 0;

    for (int mask = 0; mask < (1<<(N*M)); mask++)
    {

        for (int y = 0; y < N; y++)
        {
            for (int x = 0; x < M; x++)
            {

                binaryarr[y][x] = (mask >> ((M * y) + x)) & 1;
            }
        }

        bool visited[4][4] = { false };
        sum = 0;

        for (int y = 0; y < N; y++)
        {
            for (int x = 0; x < M; x++)
            {

                if (!visited[y][x])
                {
                    num = 0;
                    int a = x, b = y;

                    if (binaryarr[y][x] == 0)
                    {
                        while ( b < N && !visited[b][a] && binaryarr[b][a] == 0 )
                        {
                            num = arr[b][a] + num * 10;
                            visited[b][a] = true;
                            b += 1;
                        }

                        sum += num;
                    }
                    else
                    {
                        while ( a < M && !visited[b][a] && binaryarr[b][a] == 1 )
                        {
                            num = arr[b][a] + num * 10;
                            visited[b][a] = true;
                            a += 1;
                        }

                        sum += num;
                    }
                }
            }
        }
        maxresult = max(maxresult, sum);
    }

    cout << maxresult;
  
    return 0;
}

 

 

 

'프로그래밍 공부 > 백준 (C++)' 카테고리의 다른 글

[C++ / 백준 1260번] DFS와 BFS  (0) 2025.02.21
[C++ / 백준 13023번] ABCDE  (0) 2025.02.20
[C++ / 백준 1182번] 부분 수열의 합  (0) 2025.02.19
[C++ / 백준 11723번] 집합  (0) 2025.02.18
[C++ / 백준 1248번] Guess(맞춰봐)  (0) 2025.02.05
'프로그래밍 공부/백준 (C++)' 카테고리의 다른 글
  • [C++ / 백준 1260번] DFS와 BFS
  • [C++ / 백준 13023번] ABCDE
  • [C++ / 백준 1182번] 부분 수열의 합
  • [C++ / 백준 11723번] 집합
Rocketbabydolls
Rocketbabydolls
Rocketbabydolls
  • Rocketbabydolls
    With The Lights Out
    Rocketbabydolls
  • 전체
    오늘
    어제
    • 전체글 (183) N
      • 프로그래밍 공부 (117)
        • C (16)
        • Jumping into C++ (9)
        • MFC (C++) (1)
        • 자료구조 (1)
        • 알고리즘 (1)
        • 백준 (C++) (74)
        • 핸즈온 머신러닝 2판 (6)
        • Unseen 3기 준비 (4)
        • 원티드 포텐업 게임 개발자 양성과정 2기 (4)
      • 언리얼엔진5 (62) N
        • [Part1] 이득우의 언리얼 프로그래밍 (12)
        • [Part2] 이득우의 언리얼 프로그래밍 (2)
        • [Part2 복습] 이득우의 언리얼 프로그래밍 (3)
        • [Part3] 이득우의 언리얼 프로그래밍 (14)
        • [Part4] 이득우의 언리얼 프로그래밍 (0)
        • FPS 게임 1인 프로젝트 (6)
        • 각종 지식 (10) N
        • 블루프린트 Paper2D 로 게임 만들기 (14)
        • 팀 프로젝트 (1)
      • 일상 (1)
      • ETC (1)
        • 맥북 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      티스토리챌린지
      실전C프로그래밍
      언리얼엔진 옵저버 패턴
      언리얼엔진
      핸즈온 머신러닝
      오블완
      핸즈온 머신러닝 2판
      언리얼엔진 디자인 패턴
      언리얼엔진 중재자 패턴
      실전 C 프로그래밍
      실전 C프로그래밍 나중채
      c++ 17298
      c언어
      C언어 실습문제
      언리얼엔진5 fps 프로젝트
      언리얼엔진5
      실전 C프로그래밍
      실전C프로그래밍 실습문제
      실전 C프로그래밍 실습문제
      실전C프로그래밍 나중채
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    Rocketbabydolls
    [C++ / 백준 14391번] 종이 조각
    상단으로

    티스토리툴바