๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(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
}
}

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
์๊ณ ๋ฆฌ์ฆ ๊ธฐ์ด 2/2
์๊ณ ๋ฆฌ์ฆ ๊ธฐ์ด
code.plus
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค - [BOJ 22856] ํธ๋ฆฌ ์ํ (0) | 2024.07.08 |
---|---|
๋ฐฑ์ค - [BOJ 1865] ์ํ (0) | 2024.07.06 |
๋ฐฑ์ค - [BOJ 12094] A์ B (0) | 2024.02.29 |
๋ฐฑ์ค - [BOJ 2109] ์ํ๊ฐ์ฐ (4) | 2024.02.29 |
๋ฐฑ์ค - [BOJ 12015] ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2 (1) | 2024.02.01 |