๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

๋ฐฑ์ค€ - [BOJ 3085] ์‚ฌํƒ•๊ฒŒ์ž„

by ๐Ÿณ Laboon 2024. 3. 1.

๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ ธ์ง€(BOJ)์—์„œ ์ œ๊ณต ๋˜๋Š” 3085๋ฒˆ ๋ฌธ์ œ๋Š” ๋ธŒ๋ฃจํŠธ ํฌ์Šค(Brute-Froce, ์™„์ „ ํƒ์ƒ‰) ์œ ํ˜•์ด๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” code.plus ๊ธฐ์ดˆ 2/2, ๋ธŒ๋ฃจํŠธํฌ์Šค์— ๊ฒŒ์‹œ๋œ ๋ฌธ์ œ์ด๋‹ค.


๋ฌธ์ œ

์ƒ๊ทผ์ด๋Š” ์–ด๋ ธ์„ ์ ์— "๋ด„๋ณด๋‹ˆ (Bomboni)" ๊ฒŒ์ž„์„ ์ฆ๊ฒจํ–ˆ๋‹ค.

๊ฐ€์žฅ ์ฒ˜์Œ์— Nร—Nํฌ๊ธฐ์— ์‚ฌํƒ•์„ ์ฑ„์›Œ ๋†“๋Š”๋‹ค. ์‚ฌํƒ•์˜ ์ƒ‰์€ ๋ชจ๋‘ ๊ฐ™์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ƒ๊ทผ์ด๋Š” ์‚ฌํƒ•์˜ ์ƒ‰์ด ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋‘ ์นธ์„ ๊ณ ๋ฅธ๋‹ค. ๊ทธ ๋‹ค์Œ ๊ณ ๋ฅธ ์นธ์— ๋“ค์–ด์žˆ๋Š” ์‚ฌํƒ•์„ ์„œ๋กœ ๊ตํ™˜ํ•œ๋‹ค. ์ด์ œ, ๋ชจ๋‘ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๋ถ€๋ถ„(ํ–‰ ๋˜๋Š” ์—ด)์„ ๊ณ ๋ฅธ ๋‹ค์Œ ๊ทธ ์‚ฌํƒ•์„ ๋ชจ๋‘ ๋จน๋Š”๋‹ค.

์‚ฌํƒ•์ด ์ฑ„์›Œ์ง„ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ƒ๊ทผ์ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌํƒ•์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ณด๋“œ์˜ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง„๋‹ค. (3 โ‰ค N โ‰ค 50)

๋‹ค์Œ N๊ฐœ ์ค„์—๋Š” ๋ณด๋“œ์— ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์‚ฌํƒ•์˜ ์ƒ‰์ƒ์ด ์ฃผ์–ด์ง„๋‹ค. ๋นจ๊ฐ„์ƒ‰์€ C, ํŒŒ๋ž€์ƒ‰์€ P, ์ดˆ๋ก์ƒ‰์€ Z, ๋…ธ๋ž€์ƒ‰์€ Y๋กœ ์ฃผ์–ด์ง„๋‹ค.

์‚ฌํƒ•์˜ ์ƒ‰์ด ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋‘ ์นธ์ด ์กด์žฌํ•˜๋Š” ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ƒ๊ทผ์ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌํƒ•์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


ํ’€์ด

์ ‘๊ทผ๋ฒ• (์‚ฌํƒ• ๊ตํ™˜)

 

1. ์ธ์ ‘ํ•œ ์นธ๋ผ๋ฆฌ ๊ตํ™˜

2. ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์˜ ์‚ฌํƒ•์„ ์ฐพ์Œ.

3. ๋งค ์นธ ๋ฐ˜๋ณต ( ๋‹ค์Œ ์ธ์ ‘ํ•œ ์นธ ๋ผ๋ฆฌ์˜ ๊ตํ™˜์„ ์œ„ํ•ด 1์„ ํ•œ๋ฒˆ ๋” ์ˆ˜ํ–‰ )

๊ฐ Index์— ์ธ์ ‘ํ•œ ์นธ์€ ์ƒํ•˜์ขŒ์šฐ๋กœ 4๊ฐœ์”ฉ ์žˆ์Œ. 

๋งค ์นธ ์ƒํ•˜์ขŒ์šฐ์˜ index์™€ ์‚ฌํƒ•์„ ๊ตํ™˜ํ•œ๋‹ค๋ฉด?

๋ชจ๋“  ์นธ์€ N^2๊ฐœ ์กด์žฌํ•˜๋ฏ€๋กœ N^2๊ฐœ ๋งˆ๋‹ค 4๋ฒˆ์”ฉ ๊ตํ™˜ํ•œ๋‹ค.

์‹œ๊ฐ„ : O(4N^2), N <= 50 ์ด๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๋งค์šฐ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


๊ฐœ์„ ๋œ ํ’€์ด

(0, 0) ์ผ ๋•Œ, ์ธ์ ‘ํ•œ ์นธ ์ค‘ ์œ—์ชฝ๊ณผ ์™ผ์ชฝ์„ ์ƒ๊ฐํ•ด๋ณด์ž. out of bounds์ด๋‹ค. 
๋˜, ๋ฐฐ์—ด์˜ ํƒ์ƒ‰ ์ด์ค‘ for๋ฌธ์„ ์ƒ๊ฐํ•ด๋ณด์ž. 

ํ•œ ํ–‰์— ์†ํ•œ ๋ชจ๋“  ์—ด์˜ ์›์†Œ๋ฅผ ๋‹ค ๋ฐฉ๋ฌธํ•œ ๋’ค ๋‹ค์Œ ํ–‰์„ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰, ํ•œ ์›์†Œ ์ž…์žฅ์—์„œ ์™ผ์ชฝ๊ณผ ์œ—์ชฝ์— ์†ํ•œ ์›์†Œ๋“ค์€ ์ด๋ฏธ ์ด์ „ ๋‹จ๊ณ„์—์„œ ํ•œ ๋ฒˆ์˜ ๊ตํ™˜์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ธ์ ‘ํ•œ ๋„ค ๋ฐฉํ–ฅ ์ค‘ ๋‘ ๋ฐฉํ–ฅ๋งŒ ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์‹œ๊ฐ„์€ O(4N^2) -> O(2N^2)์œผ๋กœ ์ค„์–ด๋“ ๋‹ค.


ํ•ต์‹ฌ ๋กœ์ง (์‚ฌํƒ• ๊ตํ™˜ ํ›„ ๊ฐ€์žฅ ๋งŽ์ด ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ˆ˜ ์ฐพ๊ธฐ)

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” n*n ์ด๋ฏ€๋กœ ์ด๊ฑด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค.

for(int i = 0; i<n; i++) {
    for(int j = 0; j<n; j++) {
    	arr[i][j] = 0; // col
    }
    for(int j = 0; j<n; j++) {
    	arr[j][i] = 0; // row
    }
}

์ฃผํ™ฉ์ƒ‰ ์ˆซ์ž = row, ๊ฒ€์ •์ƒ‰ ์ˆซ์ž = col

 

1. ํ•œ ํ–‰ ๋˜๋Š” ์—ด์— ๋Œ€ํ•ด์„œ ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค.

2. ํ˜„์žฌ ์ƒ‰๊น”๊ณผ ๋‹ค๋ฅธ ์‚ฌํƒ•์„ ๋ฐœ๊ฒฌํ•œ๋‹ค๋ฉด ๋‹ค์‹œ 1๊ฐœ๋กœ ์ค„์ธ๋‹ค.

3. 1๋ฒˆ์— ๋Œ€ํ•ด์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ €์žฅํ•ด๋‘”๋‹ค.

 

์œ„์™€๊ฐ™์€ ๋ฐฉ๋ฒ•๋„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์Šค์™‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •

col ์—์„œ swap์ด ๋ฐœ์ƒํ•  ์‹œ ํ•ด๋‹น (col, col+1, row) ๋งŒ ๋ฐ”๋€ ๊ฒƒ์ด๋ฏ€๋กœ 3๊ฐ€์ง€๋งŒ ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค.

row ์—์„œ swap์ด ๋ฐœ์ƒํ•  ์‹œ ํ•ด๋‹น (row, row+1, col) ๋งŒ ๋ฐ”๋€ ๊ฒƒ์ด๋‹ค.

 

์ฆ‰, N x N์— ๋Œ€ํ•ด์„œ ํ™•์ธํ•  ํ•„์š” ์—†์ด ํŠน์ • ๋‘ ์—ด๊ณผ ํ•œ ํ–‰ ๋˜๋Š” ํ•œ ์—ด๊ณผ ๋‘ ํ–‰๋งŒ ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค.

๋ฌผ๋ก  ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ’€์ด๊ฐ€ ๋  ๋งŒํผ N์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์–ด์„œ ๊ตณ์ด ํšจ์œจ์„ ๋”ฐ์งˆ ํ•„์š”๋Š” ์—†๋‹ค.

 

๊ฐœ์„ ๋œ ๋ฐฉ๋ฒ•์˜ ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋‹ค.

๋ณ€๊ฒฝ๋œ ์œ„์น˜์—์„œ๋งŒ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋ฏ€๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ดˆ๊ธฐ์— ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋งจ์ฒ˜์Œ ํ•œ ๋ฒˆ, ์ „์ฒด์—์„œ ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. 

 

Brute-Force
/*
	authored by jihwankim
	dev-dot.tistory.com
	code.plus
*/
#include <iostream>
#include <algorithm>

using namespace std;

int n;

int readCnt(vector<string> &arr, int y, int ye, int x, int xe) {
	char c;
	int cnt;
	int maxCnt = 0;
	
	//readCol
	for(int i = y; i<=ye; i++) {
		c = arr[i][0]; cnt = 0;
		for(int j = 0; j<n; j++) {
			if(arr[i][j] != c) {
				maxCnt = max(maxCnt, cnt);
				c = arr[i][j];
				cnt = 0;
			}
			if(arr[i][j] == c) cnt++;
		}
		maxCnt = max(maxCnt, cnt);
		
	}
	//readRow
	for(int i = x; i<=xe; i++) {
		c = arr[0][i]; cnt = 0;
		for(int j = 0; j<n; j++) {
			if(arr[j][i] != c) {
				maxCnt = max(maxCnt, cnt);
				c = arr[j][i];
				cnt = 0;
			}
			if(arr[j][i] == c) cnt++;
		}
		maxCnt = max(maxCnt, cnt);
		
	}
		
	return maxCnt;
}

int initRead(vector<string> &arr) {
	char c; int cnt;
	int maxCnt = 0;
	
	for(int i = 0; i<n; i++) {
		//readCol
		c = arr[i][0]; cnt = 0;
		for(int j = 0; j<n; j++) {
			if(arr[i][j] != c) {
				maxCnt = max(maxCnt, cnt);
				c = arr[i][j];
				cnt = 0;
			}
			if(arr[i][j] == c) cnt++;
		}
		maxCnt = max(maxCnt, cnt);
		c = arr[i][0]; cnt = 0;
		
		//readRow
		for(int j = 0; j<n; j++) {
			if(arr[j][i] != c) {
				maxCnt = max(maxCnt, cnt);
				c = arr[j][i];
				cnt = 0;
			}
			if(arr[j][i] == c) cnt++;
		}
		maxCnt = max(maxCnt, cnt);
	}
	return maxCnt;
}

int solve(vector<string> &arr) {
	int maxCnt = initRead(arr);
	for(int i = 0; i<n; i++) {
		for(int j = 0; j<n; j++) {
			if(i+1 < n) {
				if(arr[i][j] != arr[i+1][j]) {
					swap(arr[i][j], arr[i+1][j]);
					maxCnt = max(maxCnt, readCnt(arr, i, i+1, j, j));
					swap(arr[i][j], arr[i+1][j]);
				}
			}
			
			if(j+1 < n) {
				if(arr[i][j] != arr[i][j+1]) {
					swap(arr[i][j], arr[i][j+1]);
					maxCnt = max(maxCnt, readCnt(arr, i, i, j, j+1));
					swap(arr[i][j], arr[i][j+1]);
				}
			}
		}
	}
	return maxCnt;
}

vector<string> input() {
	cin >> n;
	vector<string> s(n);
	for(int i = 0; i<n; i++) {
		cin >> s[i];
	}
	return s;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(NULL);
	
	vector<string> s = input();
	cout << solve(s);
	
	return 0;
}

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์˜ˆ์ „์— ๋ธ”๋กœ๊ทธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „, ๋‹จ ํ•œ ๋ฒˆ ๋…ธ์…˜์— ์ž‘์„ฑํ•ด๋‘์—ˆ๋˜ ๋‚ด์šฉ์ธ๋ฐ..

์ง€๊ธˆ์™€์„œ ๋ณด๋‹ˆ๊นŒ ์ˆ˜์ •ํ•  ์ ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค..

๊ทธ๋ž˜๋„ ์„ฑ์žฅํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ๊ธฐ์˜๋‹ค ^^

์ฝ”๋“œ๋„ ํ›จ์”ฌ ๊ฐ„๋žตํ•˜๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒ ๊ณ  ๋กœ์ง๋„ ๋” ๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ•์ด ๋– ์˜ค๋ฅธ๋‹ค.

 

์ฐธ๊ณ ํ•  ํฌ์ŠคํŠธ

 

์•„์ง ๋ฏธ์ž‘์„ฑ

๋ฌธ์ œ

 

https://www.acmicpc.net/problem/3085

 

3085๋ฒˆ: ์‚ฌํƒ• ๊ฒŒ์ž„

์˜ˆ์ œ 3์˜ ๊ฒฝ์šฐ 4๋ฒˆ ํ–‰์˜ Y์™€ C๋ฅผ ๋ฐ”๊พธ๋ฉด ์‚ฌํƒ• ๋„ค ๊ฐœ๋ฅผ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค.

www.acmicpc.net

https://code.plus/course/42

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ์ดˆ 2/2

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ์ดˆ

code.plus