๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ณต๋ถ€/C++

๋ฐฑ์ค€ 14502๋ฒˆ : ์—ฐ๊ตฌ์†Œ with C++

๋ฌธ์ œ

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์•„์ง ํผ์ง€์ง€ ์•Š์•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์—ฐ๊ตฌ์†Œ์— ๋ฒฝ์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค.

์—ฐ๊ตฌ์†Œ๋Š” ํฌ๊ธฐ๊ฐ€ N×M์ธ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง์‚ฌ๊ฐํ˜•์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ๋นˆ ์นธ, ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๋ฒฝ์€ ์นธ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋“ ์ฐจ์ง€ํ•œ๋‹ค. 

์ผ๋ถ€ ์นธ์€ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ์นธ์œผ๋กœ ๋ชจ๋‘ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ƒˆ๋กœ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š” ๋ฒฝ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ์ด๋ฉฐ, ๊ผญ 3๊ฐœ๋ฅผ ์„ธ์›Œ์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฐ๊ตฌ์†Œ๊ฐ€ ์ƒ๊ธด ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

2 0 0 0 1 1 0
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0

์ด๋•Œ, 0์€ ๋นˆ ์นธ, 1์€ ๋ฒฝ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ๊ณณ์ด๋‹ค. ์•„๋ฌด๋Ÿฐ ๋ฒฝ์„ ์„ธ์šฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋ชจ๋“  ๋นˆ ์นธ์œผ๋กœ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

2ํ–‰ 1์—ด, 1ํ–‰ 2์—ด, 4ํ–‰ 6์—ด์— ๋ฒฝ์„ ์„ธ์šด๋‹ค๋ฉด ์ง€๋„์˜ ๋ชจ์–‘์€ ์•„๋ž˜์™€ ๊ฐ™์•„์ง€๊ฒŒ ๋œ๋‹ค.

2 1 0 0 1 1 0
1 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 1 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0

๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ๋’ค์˜ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™์•„์ง„๋‹ค.

2 1 0 0 1 1 2
1 0 1 0 1 2 2
0 1 1 0 1 2 2
0 1 0 0 0 1 2
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0

๋ฒฝ์„ 3๊ฐœ ์„ธ์šด ๋’ค, ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์งˆ ์ˆ˜ ์—†๋Š” ๊ณณ์„ ์•ˆ์ „ ์˜์—ญ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์œ„์˜ ์ง€๋„์—์„œ ์•ˆ์ „ ์˜์—ญ์˜ ํฌ๊ธฐ๋Š” 27์ด๋‹ค.

์—ฐ๊ตฌ์†Œ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ ์˜์—ญ ํฌ๊ธฐ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ง€๋„์˜ ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (3 ≤ N, M ≤ 8)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ง€๋„์˜ ๋ชจ์–‘์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ, 1์€ ๋ฒฝ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์œ„์น˜์ด๋‹ค. 2์˜ ๊ฐœ์ˆ˜๋Š” 2๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

๋นˆ ์นธ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ ์ด์ƒ์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ ์˜์—ญ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

1. ์ง€๋„๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

2. ์ง€๋„์—์„œ ๋ฒฝ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ขŒํ‘œ๋ฅผ wall ํ–‰๋ ฌ์— ์ž…๋ ฅํ•œ๋‹ค.

3. for๋ฌธ์„ ์ด์šฉํ•˜๋ฉฐ ๋ฒฝ์„ 3๊ฐœ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

4. ๋ฒฝ์„ 3๊ฐœ ๋†“์•˜์„ ๋•Œ์˜ ์ง€๋„๋ฅผ n_map์— ์ž…๋ ฅํ•˜๊ณ  ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง€๋Š” ๊ฒƒ์„ virus_spread ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

5. โ†˜โ†—โ†™โ†–์˜ ๋ฐฉํ–ฅ ๋ชจ๋‘ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง€๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•ด์ฃผ์–ด ๋ฐ˜๋ก€๊ฐ€ ์—†๋„๋ก ํ•œ๋‹ค.

๊ตฌํ˜„ ์‹œ๊ฐ„

180ms

 

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

int map[9][9];
int n_map[9][9];
int N, M;
int virus[11][2];
int wall[64][2];

int wallcase()
{	// ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋ฒฝ ์œ„์น˜ ์ฐพ๊ธฐ
	int wall_num = 0;
	for(int i = 0; i < N; i++){
		for(int j = 0; j < M; j++){	
			if(map[i][j] == 0){
				wall[wall_num][0] = i;
				wall[wall_num][1] = j;
				wall_num++;
			}
		}
	}

	return wall_num;
}

void virus_spread(int n, int m){
	int spread = 1;
	while(m+spread < M && n_map[n][m+spread] != 1)
	{	// ๋ฐ”์ด๋Ÿฌ์Šค ์šฐ๋กœ ํผ์ง
		n_map[n][m+spread] = 2;
		spread++;
	}
	spread = 1;
	while(m-spread >= 0 && n_map[n][m-spread] != 1)
	{	// ๋ฐ”์ด๋Ÿฌ์Šค ์ขŒ๋กœ ํผ์ง
		n_map[n][m-spread] = 2;
		spread++;
	}
	spread = 1;
	while(n+spread < N && n_map[n+spread][m] != 1)
	{	// ๋ฐ”์ด๋Ÿฌ์Šค ์•„๋ž˜๋กœ ํผ์ง
		n_map[n+spread][m] = 2;
		spread++;
	}
	spread = 1;
	while(n-spread >= 0 && n_map[n-spread][m] != 1)
	{	// ๋ฐ”์ด๋Ÿฌ์Šค ์œ„๋กœ ํผ์ง
		n_map[n-spread][m] = 2;
		spread++;
	}
}

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

	int virus_num = 0;
	for(int i=0; i<N; i++)
	{
		for(int j=0; j<M; j++)
		{
			cin >> map[i][j];
			if(map[i][j] == 2)
			{	// ๋ฐ”์ด๋Ÿฌ์Šค ์œ„์น˜ ์ž…๋ ฅ
				virus[virus_num][0] = i;
				virus[virus_num][1] = j;
				virus_num++;
			}
		}
	}

	int wall_num = wallcase();

	int max_Safe = 0;
	for(int i=0; i<wall_num-2; i++)	// ๋ฒฝ 3๊ฐœ๋ฅผ ๋†“์•˜์„ ๋•Œ ๋ฐ”๋€Œ๋Š” ์ƒˆ ์ง€๋„
	{
		for(int j=i+1; j<wall_num-1; j++)
		{
			for(int k=j+1; k<wall_num; k++)
			{
				//copy(&map[0][0], &map[N][M] + (N * M), &n_map[0][0]);

				for(int n=0; n<N; n++){	// n_map ๋ณต์‚ฌ
					for(int m=0; m<M; m++){
						n_map[n][m] = map[n][m];
					}
				}
				
				// ๋ฒฝ ๋†“๊ธฐ
				n_map[wall[i][0]][wall[i][1]] = 1;
				n_map[wall[j][0]][wall[j][1]] = 1;
				n_map[wall[k][0]][wall[k][1]] = 1;
				

				int SafeZone_num = 0;

				for(int n=0; n<N; n++){	// ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง
					for(int m=0; m<M; m++){
						if(n_map[n][m] == 2){
							virus_spread(n, m);
						}
					}
				}
				for(int n=N-1; n>=0; n--){	// ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง
					for(int m=0; m<M; m++){
						if(n_map[n][m] == 2){
							virus_spread(n, m);
						}
					}
				}
				for(int n=0; n<N; n++){	// ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง
					for(int m=M-1; m>=0; m--){
						if(n_map[n][m] == 2){
							virus_spread(n, m);
						}
					}
				}
				for(int n=N-1; n>=0; n--){	// ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง
					for(int m=M-1; m>=0; m--){
						if(n_map[n][m] == 2){
							virus_spread(n, m);
						}
					}
				}

				for(int n=0; n<N; n++){	// ์•ˆ์ „์ง€๋Œ€ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
					for(int m=0; m<M; m++){
						if(n_map[n][m] == 0){
							SafeZone_num++;
						}
					}
				}

				if(SafeZone_num > max_Safe){	//์•ˆ์ „์ง€๋Œ€ ์ตœ๋Œ“๊ฐ’ ๊ตฌํ•˜๊ธฐ
					max_Safe = SafeZone_num;
				}

			}
		}
	}

	cout << max_Safe;

	return 0;
}