Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 1915. ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜• ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 1915. ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•

bba_dda 2021. 4. 14. 12:55
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ 

๋ฐฐ์—ด์—์„œ 1๋กœ ๋œ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•ด๋ผ! 

www.acmicpc.net/problem/1915

 

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

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

www.acmicpc.net

ํ’€์ด

DP๋ฅผ ์ด์šฉํ•˜๊ฒ ๋‹ค! 

cache[r][c] = min(min(cache[r + 1][c], cache[r + 1][c + 1]), cache[r][c + 1])+1;

 

cache๋ฐฐ์—ด์—์„œ ์ œ์ผ ์•„๋ž˜ ํ–‰, ์˜ค๋ฅธ์ชฝ ์—ด์€ table๊ณผ ๋˜‘๊ฐ™์ด ์ฑ„์›Œ์ค€๋‹ค. 

๊ทธ ํ›„์— ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ, table๊ฐ’์ด 0์ด๋ฉด 0์œผ๋กœ ์ฑ„์šฐ๊ณ  ๋„˜์–ด๊ฐ€๊ณ , 

0์ด ์•„๋‹ˆ๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด cache[r + 1][c], cache[r + 1][c + 1], cache[r][c + 1]๊ฐ’๋“ค ์ค‘์— ์ตœ์†Ÿ๊ฐ’ +1์„ ์ฑ„์šฐ๋ฉด ๋œ๋‹ค.

 

์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ cache๋ฐฐ์—ด์„ ๋ชจ๋‘ ์ฑ„์šฐ๋ฉด ๋งจ ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™๋‹ค 

์ฝ”๋“œ

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;
int cache[1000][1000];
int table[1000][1000];

int main(void) {
	int n, m;
	cin >> n >> m;
	
	int maxS = 0;
	for (int i = 0;i < n;i++) {
		string s;
		cin >> s;
		for (int j = 0;j < m;j++) {
			table[i][j] = s[j] - '0';
		}
	}
	for (int r = 0;r < n;r++) {
		cache[r][m - 1] = table[r][m - 1];
		maxS = max(maxS, cache[r][m - 1]);
	}
	for (int c = 0;c < m;c++) {
		cache[n - 1][c] = table[n - 1][c];
		maxS = max(maxS, cache[n - 1][c]);
	}
	for (int r = n - 2;r >= 0;r--) {
		for (int c = m - 2;c >= 0;c--) {
			if (table[r][c] == 0)
				cache[r][c] = 0;
			else {
				cache[r][c] = min(min(cache[r + 1][c], cache[r + 1][c + 1]), cache[r][c + 1])+1;
				maxS = max(maxS, cache[r][c]);
			}
		}
	}
	cout << maxS*maxS << endl;
	return 0;
}

 

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๋ ค๊ณ  ๋…ธ๋ ฅํ•ด๋ณธ ์ฝ”๋“œ 

- cache ๋ฐฐ์—ด ์—†์• ๊ณ , table์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ 

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;
int table[1000][1000];

int main(void) {
	int n, m;
	cin >> n >> m;
	
	int maxS = 0;
	for (int i = 0;i < n;i++) {
		string s;
		cin >> s;
		for (int j = 0;j < m;j++) {
			table[i][j] = s[j] - '0';
			if (table[i][j] == 1)
				maxS = 1;
		}
	}
	for (int r = n - 2;r >= 0;r--) {
		for (int c = m - 2;c >= 0;c--) {
			if (table[r][c] == 0)
				continue;
			else {
				table[r][c] = min(min(table[r + 1][c], table[r + 1][c + 1]), table[r][c + 1])+1;
				maxS = max(maxS, table[r][c]);
			}
		}
	}
	cout << maxS*maxS << endl;
	return 0;
}

๊ฒฐ๊ณผ

๋†€๋ž๊ฒŒ๋„ ์‹œ๊ฐ„์€ ์ „ํ˜€ ์ค„์–ด๋“ค์ง€ ์•Š์•˜๋‹ค! 

 

ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฐฐ์—ด์„ ์„ ์–ธํ•  ๋•Œ๋Š”, main ํ•จ์ˆ˜ ๋ฐ”๊นฅ์— ์ „์—ญ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค 

(mainํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธํ–ˆ๋”๋‹ˆ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์ค‘์— ๊บผ์ง€๋Š” ํ˜„์ƒ ๋ฐœ์ƒ) 

๋ฐ˜์‘ํ˜•