From 4be02cb2ec4ac07402806f8661815cc3d5b54c99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EB=AC=B8=ED=98=95?= <74577714+alirz-pixel@users.noreply.github.com> Date: Sat, 24 Jan 2026 00:20:21 +0900 Subject: [PATCH] =?UTF-8?q?260123=20:=20[BOJ=201451]=20=EC=A7=81=EC=82=AC?= =?UTF-8?q?=EA=B0=81=ED=98=95=EC=9C=BC=EB=A1=9C=20=EB=82=98=EB=88=84?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _munhyeong/1415.cpp | 117 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 _munhyeong/1415.cpp diff --git a/_munhyeong/1415.cpp b/_munhyeong/1415.cpp new file mode 100644 index 00000000..a31c2a1e --- /dev/null +++ b/_munhyeong/1415.cpp @@ -0,0 +1,117 @@ +#include +#include +#include + +using namespace std; + +int main() { + int N, M; + cin >> N >> M; + + vector> board(N, vector(M)); + vector> sum_board(N, vector(M)); + for (int y = 0; y < N; y++) { + string input; + cin >> input; + + for (int x = 0; x < M; x++) { + board[y][x] = (long long)input[x] - '0'; + } + } + + sum_board[0][0] = board[0][0]; + for (int x = 1; x < M; x++) + sum_board[0][x] = sum_board[0][x - 1] + board[0][x]; + for (int y = 1; y < N; y++) + sum_board[y][0] = sum_board[y - 1][0] + board[y][0]; + + for (int y = 1; y < N; y++) { + for (int x = 1; x < M; x++) { + sum_board[y][x] = + sum_board[y - 1][x] + + sum_board[y][x - 1] - + sum_board[y - 1][x - 1] + + board[y][x]; + + } + } + + // 0, 0을 포함하는 모든 직사각형을 구하기 + long long A, B, C; + long long answer = 0; + for (int y = 0; y < N; y++) { + for (int x = 0; x < M; x++) { + long long A = sum_board[y][x]; + + // 해당 직사각형을 기준으로 x가 같은 또 다른 직사각형 + // 즉, y + 1 ~ N - 1까지 + if (y != N - 1) { + B = sum_board[N - 1][x] - A; + C = sum_board[N - 1][M - 1] - A - B; + + answer = max(answer, A * B * C); + } + + + // 해당 직사각형을 기준으로 y가 같은 또 다른 직사각형 + // 즉, x + 1 ~ M - 1까지 + if (x != M - 1) { + B = sum_board[y][M - 1] - A; + C = sum_board[N - 1][M - 1] - A - B; + + answer = max(answer, A * B * C); + } + } + } + + // 높이가 전부 같은 + for (int x = 0; x < M - 2; x++) { + for (int xx = x + 1; xx < M - 1; xx++) { + long long A = sum_board[N - 1][x]; + long long B = sum_board[N - 1][xx] - A; + long long C = sum_board[N - 1][M - 1] - A - B; + + answer = max(answer, A * B * C); + } + } + + // 너비가 전부 같은 + for (int y = 0; y < N - 2; y++) { + for (int yy = y + 1; yy < N - 1; yy++) { + long long A = sum_board[y][M - 1]; + long long B = sum_board[yy][M - 1] - A; + long long C = sum_board[N - 1][M - 1] - A - B; + + answer = max(answer, A * B * C); + } + } + + // 0, 0을 포함한 직사각형이 가로로 꽉 찬 사각형이라면? + for (int y = 0; y < N - 2; y++) { + long long A = sum_board[y][M - 1]; + for (int x = 0; x < M - 1; x++) { + // 나머지 사각형은 나머지를 각각 가져가야 함 + long long B = sum_board[N - 1][x] - sum_board[y][x]; + long long C = sum_board[N - 1][M - 1] - A - B; + + answer = max(answer, A * B * C); + } + } + + + // 0, 0을 포함한 직사각형이 세로로 꽉 찬 사각형이라면? + for (int x = 0; x < M - 2; x++) { + long long A = sum_board[N - 1][x]; + for (int y = 0; y < N - 1; y++) { + // 나머지 사각형은 나머지를 각각 가져가야 함 + long long B = sum_board[y][M - 1] - sum_board[y][x]; + long long C = sum_board[N - 1][M - 1] - A - B; + + answer = max(answer, A * B * C); + } + } + + cout << answer; + + return 0; +}