๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 1915 : ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•

by Jaeguk 2022. 4. 4.
๋ฌธ์ œ ๋งํฌ

1915๋ฒˆ: ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜• (acmicpc.net)

 

1915๋ฒˆ: ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•

์ฒซ์งธ ์ค„์— n, m(1 ≤ n, m ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ n๊ฐœ์˜ ์ค„์—๋Š” m๊ฐœ์˜ ์ˆซ์ž๋กœ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

0,1๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์—์„œ 1๋กœ๋œ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.

https://jk6722.tistory.com/entry/BOJ-1028-%EB%8B%A4%EC%9D%B4%EC%95%84%EB%AA%AC%EB%93%9C-%EA%B4%91%EC%82%B0

 

[BOJ] 1028 : ๋‹ค์ด์•„๋ชฌ๋“œ ๊ด‘์‚ฐ

๋ฌธ์ œ ๋งํฌ 1028๋ฒˆ: ๋‹ค์ด์•„๋ชฌ๋“œ ๊ด‘์‚ฐ (acmicpc.net) 1028๋ฒˆ: ๋‹ค์ด์•„๋ชฌ๋“œ ๊ด‘์‚ฐ ์ฒซ์งธ ์ค„์— R๊ณผ C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. R๊ณผ C๋Š” 750๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ R๊ฐœ์˜ ์ค„์—๋Š” ๋‹ค์ด์•„๋ชฌ๋“œ ๊ด‘์‚ฐ์˜ ๋ชจ์–‘์ด

jk6722.tistory.com

์ €๋ฒˆ์— ํ’€์–ด๋ดค๋˜ ๋‹ค์ด์•„๋ชฌ๋“œ ๊ด‘์‚ฐ์˜ ํ•˜์œ„๋ฒ„์ „์ธ ๊ฒƒ ๊ฐ™๋‹ค.

ํ’€์ด

๋จผ์ € ๊ฐ ์ง€์ ๋งˆ๋‹ค ๊ทธ ์ง€์ ๋ถ€ํ„ฐ ๊ฐ€๋กœ๋กœ ์ตœ๋Œ€๊ธธ์ด๋ฅผ Right ๋ผ๋Š” ๋ฐฐ์—ด์— ์ €์žฅํ•ด๋‘์—ˆ๋‹ค.

๋งŒ์•ฝ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋งจ ์œ„์ชฝ, ๋งจ ์™ผ์ชฝ ์ง€์ ์ธ (1,1)์„ ๊ธฐ์ค€์œผ๋กœ ์ตœ๋Œ€๊ธธ์ด๊ฐ€ ์•„๋ž˜๋กœ ๊ฐ€๋ฉด์„œ ๊ฐ๊ฐ 3, 2, 2 ์ด๋‹ค. ์ด๋•Œ ์ตœ๋Œ€ ์‚ฌ๊ฐํ˜•์œผ ํฌ๊ธฐ๋Š” 4์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆผ์œผ๋กœ ๋ด์„œ 3, 2, 2์ผ ๋•Œ ์ตœ๋Œ€ํฌ๊ธฐ๊ฐ€ 4์ธ ๊ฒƒ์„ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ”๋“œ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘์„œํ• ๊นŒ?

(1,1) ์ง€์ ์„ ์‹œ์ž‘์œผ๋กœ x์ถ•์€ ๊ณ ์ •ํ•ด๋‘”์ฑ„ y๋งŒ ํ•˜๋‚˜์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉด์„œ ํƒ์ƒ‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ํƒ์ƒ‰ ๋ฒ”์œ„๋Š” ์œ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•œ๋‹ค. ์ € ๊ทธ๋ฆผ์„ ์˜ˆ์‹œ๋กœ ์ฒ˜์Œ์— (1,1) ์ง€์ ์—์„œ ๊ฐ€๋กœ ์ตœ๋Œ€๊ธธ์ด๋Š” 3์ด๋ฏ€๋กœ 3X3 ์งœ๋ฆฌ ์ •์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘”๋‹ค. ํ•˜์ง€๋งŒ (2,1)๋กœ ๋‚ด๋ ค์™”์„ ๋•Œ ๊ฐ€๋กœ ์ตœ๋Œ€๊ธธ์ด๊ฐ€ 2์ด๋ฏ€๋กœ 3X3 ์งœ๋ฆฌ ์ •์‚ฌ๊ฐํ˜•์€ ์ด๋ฏธ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ๊นŒ์ง€ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” 4์ด๊ณ  ๋” ์ด์ƒ ํƒ์ƒ‰์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ํƒ์ƒ‰๋ฒ”์œ„๋ฅผ ์ค„์—ฌ์„œ ํƒ์ƒ‰์„ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.

(i, j) ์ง€์ ์—์„œ ์ตœ๋Œ€ ์ •์‚ฌ๊ฐํ˜• ํฌ๊ธฐ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ํƒ์ƒ‰ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

			int boundary = Right[i][j];
			int Max = 1;
			for (int k = 0; k < boundary; k++) {
				if(Right[i+k][j] >= k + 1)
					Max = max(Max, k + 1);
				boundary = min(boundary, Right[i + k][j]);
			}
			ans = max(Max, ans);

boundary๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘˜ ์ˆ˜ ์žˆ๋Š” ์ •์‚ฌ๊ฐํ˜• ํ•œ ๋ณ€์˜ ๊ธธ์ด์˜ ์ตœ๋Œ€์ด๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ ์‹œ์ž‘ ์ง€์ ์˜ ์ตœ๋Œ€ ๊ฐ€๋กœ ๊ธธ์ด์ด๋‹ค.

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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<ll, int>pair<intint>>vector<pair<pair<ll, int>pair<intint>>>, greater<pair<pair<ll, int>pair<intint>>>> Priority_queue;
const long long INF = LLONG_MAX;
const int MAX_N = 1000 + 5;
int Map[MAX_N][MAX_N];
int N, M;
int Right[MAX_N][MAX_N];
 
int main(void) {
    //ios_base::sync_with_stdio(false);
    //cin.tie(NULL);
    cin >> N >> M;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            scanf("%1d"&Map[i][j]);
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (Map[i][j] != 1)
                continue;
            if (j > 0 && Right[i][j - 1!= 0) {
                Right[i][j] = Right[i][j - 1- 1;
                continue;
            }
            int cnt = 0;
            for (int k = j; k < M; k++) {
                if (!Map[i][k])
                    break;
                cnt++;
            }
            Right[i][j] = cnt;
        }
    }
    int ans = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (!Map[i][j])
                continue;
            int boundary = Right[i][j];
            int Max = 1;
            for (int k = 0; k < boundary; k++) {
                if(Right[i+k][j] >= k + 1)
                    Max = max(Max, k + 1);
                boundary = min(boundary, Right[i + k][j]);
            }
            ans = max(Max, ans);
        }
    }
    cout << ans * ans << "\n";
 
    return 0;
}
 
cs

ans์— ์ €์žฅ๋œ ๊ฐ’์€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด ์ด๋ฏ€๋กœ ํฌ๊ธฐ๋Š” ans * ans ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

2๋…„ ์ „์— ๋ชปํ’€์—ˆ๋˜ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

728x90