๋ฌธ์
๋๊ตด์ ์๋ ๋ฏธ๋ค๋์ ๋ชจ์๊ณผ ๋ ์ฌ๋์ด ๋์ง ๋ง๋์ ๋์ด๊ฐ ์ฃผ์ด์ง๋ค. ๋ชจ๋ ๋ง๋๋ฅผ ๋์ง๊ณ ๋ ์ดํ์ ๋ฏธ๋ค๋ ๋ชจ์์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ 1
5 6
. . . . . .
. . X X . .
. . X . . .
. X X X X .
1
3
์ถ๋ ฅ 1
. . . . . .
. . . . . .
. . X X . .
. . X X . .
. X X X X .
์ฝ๋
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#define y first
#define x second
using namespace std;
//2933๋ฒ ๋ฏธ๋ค๋
//2์ฐจ์ ๋ฐฐ์ด ์ ์ธ
char arr[101][101];
int visited[101][101]; //dfs๋ฅผ ์ํ ๋ฐฉ๋ฌธ ๋ฐฐ์ด
int R, C;
vector<pair<int,int>> cluster;
int arrow[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
void DFS(int yIdx, int xIdx) {
if (arr[yIdx][xIdx] == '.' || visited[yIdx][xIdx]) return;
visited[yIdx][xIdx] = true;
cluster.push_back({yIdx,xIdx});
//์ข์ฐ์์๋ ํ์
for (int i = 0; i < 4; i++) {
int ny = yIdx + arrow[i][0];
int nx = xIdx + arrow[i][1];
if (nx >= 0 && nx < C && ny >= 0 && ny < R)
DFS(ny, nx);
}
}
void checkCluster() {
memset(visited, 0, sizeof(visited));
for (int a = 0; a < R; a++) {
for (int b = 0; b < C; b++) {
if (arr[a][b] == '.' || visited[a][b]) continue;
cluster.clear();
DFS(a,b);
vector<int> low(C, -1); //vector(์ปจํ
์ด๋ ํฌ๊ธฐ, ๊ฐ๊ฐ ํ ๋น๋ ๊ฐ)
for (int z = 0; z < cluster.size(); z++) {
pair<int, int> p= cluster[z];
low[p.x] = max(low[p.x], p.y);
arr[p.y][p.x] = '.';
}
//์ผ๋ง๋ ๋ฐ์ผ๋ก ์ฎ๊ธธ์ง i์ ๋ฃ๊ธฐ
int lowmove = R;
for (int i, j = 0; j < C; j++) {
if (low[j] == -1) continue;
i = low[j];
//'.'์ด ์๋๊ฒฝ์ฐ, ํ์ ๋์ด๊ฐ ๋์ด๋ณด๋ค ์์ ๊ฒฝ์ฐ
while (i < R &&arr[i][j] == '.') {
i++;
}
lowmove = min(lowmove, i - low[j] - 1);
}
for (int i = 0; i < cluster.size(); i++) {
pair<int, int> p = cluster[i];
p.y += lowmove;
arr[p.y][p.x] = 'x';
visited[p.y][p.x] = true;
}
}
}
}
void shoot(int orderNum,int height) {
//์ผ์ชฝ์ธ์ง ์ค๋ฅธ์ชฝ์ธ์ง ํ๋จ
height = R - height;
if (orderNum % 2 == 0) {
for (int i = 0; i < C; i++) {
if (arr[height][i] == 'x') {
arr[height][i] = '.';
break;
}
}
}
else {
for (int i = C-1; i >= 0; i--) {
if (arr[height][i] == 'x') {
arr[height][i] = '.';
break;
}
}
}
checkCluster();
}
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
cin >> R >> C;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> arr[i][j];
}
}
int N,height=0;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> height;
shoot(i, height);
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cout << arr[i][j];
}
cout << "\n";
}
return 0;
}
*๊ฐ๋จํ ํด์ค*
checkCluster() ํจ์ ๋ถ๋ถ์ https://100100e.tistory.com/152 ์ด ๋ธ๋ก๊ทธ ๋ถ์ ๊ธ์ ์ฐธ๊ณ ํ์ฌ์ ์ ์ํ์๋ค. ์ ์ผ ๋๋ ์๊ฐ์ด ๋น์ทํ๊ธฐ๋ ํ๊ณ ์๊ธฐ ์ฝ๊ฒ ์์ฑ๋์ด์์ด์ ์ข์๋ค. checkCluster() ๋ถ๋ถ์ ์์ธํ๊ฒ ์ค๋ช ํด๋ณผ๊น ์ถ๋ค.
memset(visited, 0, sizeof(visited));
for (int a = 0; a < R; a++) {
for (int b = 0; b < C; b++) {
checkCluster๋ ๋ถ๋ฉ๋์ ๋์ง ํ์ ๋จ์ด์ง๋ ํด๋ฌ์คํฐ๋ค์ ํ๋จํ๊ธฐ ์ํ ํจ์๋ก์จ ์คํ๋๋ค. ๋ฐ๋ผ์ DFS๋ฅผ ๋ค์ ์ฌ์ฉํ๋ ค๋ฉด visited ๋ฐฐ์ด์ ์ด๊ธฐํ ์์ผ์ค์ผํ๋ค. ๊ทธ๋ฅผ ์ํด memset ํจ์๋ฅผ ์ด์ฉํ์๋ค. ๋๋จธ์ง for๋ฌธ์ R x C ํฌ๊ธฐ์ ๋งต์ for๋ฌธ์ ํตํด ๋๋ฆฐ๋ค.
if (arr[a][b] == '.' || visited[a][b]) continue;
cluster.clear();
DFS(a,b);
๊ทธ ๋ค์์๋ ํด๋น ๋งต์ ์นธ์ด . ์ผ๋ก ๋น์ด์๋ ์นธ์ด๊ฑฐ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ฐฐ์ด์ผ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋ฐ์ ๊ณ์ฐ์ ํ์ง ์๊ณ ๋์ด๊ฐ๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ DFS ํจ์๋ฅผ ํตํด์ ํด๋น ํด๋ฌ์คํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ข์ฐ์์๋๋ฅผ ํ์ํด์ cluster ๋ฒกํฐ์ ๋ฃ๋๋ค.
vector<int> low(C, -1); //vector(์ปจํ
์ด๋ ํฌ๊ธฐ, ๊ฐ๊ฐ ํ ๋น๋ ๊ฐ)
for (int z = 0; z < cluster.size(); z++) {
pair<int, int> p= cluster[z];
low[p.x] = max(low[p.x], p.y);
arr[p.y][p.x] = '.';
}
๊ทธ ํ์ low ๋ผ๋ ๋ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํด๋ฌ์คํฐ๋ฅผ ์ ์ฅํ๋ ๋ฒกํฐ ๋ฐฐ์ด์ ์ ์ธํ๋ค. low(C,-1) ์ด๋ ๊ฒ ์ ์ธํ๋ฉด C ํฌ๊ธฐ ๋งํผ์ -1์ ๊ฐ์ผ๋ก ํ ๋นํ๋ค๋ ๋ง์ด๋ค. ๊ทธ ๋ค์ for๋ฌธ์ ํตํด์ ์ ์ฅ๋ cluster๋งํผ ๋๋ ค์ฃผ๊ณ ๋ง์ฝ ํด๋น ํด๋ฌ์คํฐ์ ๋์ด ๊ฐ์ธ p.y ๊ฐ์ด ๋ง์ฝ์ ๊ธฐ์กด์ ์ ์ฅ๋ ๋์ด ๊ฐ์ธ low[p.x]์ ๋น๊ตํ์ ๋ ํฐ ๊ฐ์ low[p.x]์ ์ ์ฅํด์ค๋ค. ์ ์ฅํ ๋ค์์๋ ํด๋น ๊ฐ์ ๋์ค์ ๋ค์ ๋จ์ด์ง ํด๋ฌ์คํฐ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํด์ค ๊ฒ์์ผ๋ก ๋ฏธ๋ฆฌ .์ผ๋ก ๋ณ๊ฒฝ ์์ผ์ค๋ค.
int lowmove = R;
for (int i, j = 0; j < C; j++) {
if (low[j] == -1) continue;
i = low[j];
//'.'์ด ์๋๊ฒฝ์ฐ, ํ์ ๋์ด๊ฐ ๋์ด๋ณด๋ค ์์ ๊ฒฝ์ฐ
while (i < R &&arr[i][j] == '.') {
i++;
}
lowmove = min(lowmove, i - low[j] - 1);
}
์ผ๋งํผ ๋ฐ์ผ๋ก ์ฎ๊ธธ์ง ๊ณ์ฐํ๋ ๋ถ๋ถ์ด๋ค. lowmove ๋ณ์์๋ ๊ฐ์ฅ ๋ง์ด ๋ด๋ ค๊ฐ ์ ์๋ ๊ฐ ๋์ด R๊ฐ์ ๋ฃ์ ๋ค์ ๋น๊ตํด๊ฐ๋ฉด์ ์์ผ๋ฉด ๋ณ๊ฒฝํ๋ ํ์์ด๋ค. if(low[j]==-1) continue; ์ ๊ฒฝ์ฐ ๋ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํด๋ฌ์คํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ฐ์ฐ์ ํ์ง ์๊ณ ๋์ด๊ฐ๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ i = low[j];๋ก ๋ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํด๋ฌ์คํฐ์ ๋์ด๋ฅผ ๋ฃ๋๋ค. ๊ทธ ํ while๋ฌธ์ ํตํด์ ๋ง์ฝ ํด๋น ์ขํ์ ํด๋ฌ์คํฐ๊ฐ ๋น๊ณต๊ฐ์ธ ๊ฒฝ์ฐ ๋ด๋ ค๊ฐ์ผํ ์นธ์ ๊ฐ์ธ i๋ฅผ ++ํด์ค๋ค. ํด๋น while๋ฌธ์ด ๊ธ๋๊ณ ๋๋ฉด min ํจ์๋ฅผ ํตํด ๊ธฐ์กด์ lowmove ๊ฐ๊ณผ i-low[j]-1์ ๋น๊ตํ๋ค. arr[i][j]์ ๊ฒฝ์ฐ ์๊น ์์์ .์ผ๋ก ๋ง๋ค์ด๋์๊ธฐ ๋๋ฌธ์ ํ๊ฐ๊ฐ ๋ ์ธ์ด์ง๋ค. ๋ฐ๋ผ์ ๋ด๋ ค๊ฐ์ผํ ์นธ์ ์ i ์์ -1์ ํ ๋ค์ ๊ธฐ์กด ๋์ด์ธ low[j]๋ฅผ ๋นผ์ฃผ๋ฉด ๋ด๋ ค๊ฐ์ผํ ์นธ์ ๊ฐฏ์๊ฐ ๋์จ๋ค.
for (int i = 0; i < cluster.size(); i++) {
pair<int, int> p = cluster[i];
p.y += lowmove;
arr[p.y][p.x] = 'x';
visited[p.y][p.x] = true;
}
๋ง์ง๋ง์ผ๋ก ํด๋ฌ์คํฐ์ ๊ฐฏ์ ๋งํผ for๋ฌธ์ ๋๋ ค์ lowmove ๋งํผ ๋ชจ๋ ํด๋ฌ์คํฐ๋ฅผ ์ฎ๊ฒจ์ค๋ค.
*์ด ๋ฐฉ๋ฒ๋ง์ด ๋ง๋ ์ ๋ต์ ์๋๋๋ค.
ํจ์ฌ ์ข๊ณ ๋น ๋ฅธ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถํ์๋ ๋ถ๋ค ํ์ดํ ! '0'/*
'์๊ณ ๋ฆฌ์ฆ > BaekJoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] BOJ 2749๋ฒ: ํผ๋ณด๋์น ์ 3 (0) | 2022.06.20 |
---|---|
[C++] BOJ 2244๋ฒ: ๋ฏผ์ฝ์ฐ์คํค ํฉ (0) | 2022.06.13 |
[C++] BOJ 1655๋ฒ: ๊ฐ์ด๋ฐ๋ฅผ ๋งํด์ (0) | 2022.06.08 |
[C++] BOJ 3190๋ฒ: ๋ฑ (0) | 2022.03.25 |
[C++] BOJ 2480๋ฒ: ์ฃผ์ฌ์ ์ธ๊ฐ (0) | 2022.03.19 |