์ฐ์ ๊ธฐ๋ก ๐ช
[๋ฐฑ์ค 16724] ํผ๋ฆฌ๋ถ๋ ์ฌ๋์ด(C++) ๋ณธ๋ฌธ
https://www.acmicpc.net/problem/16724
๋ฌธ์ ์ค๋ช
UDLR(์ํ์ข์ฐ)๋ก ๊ฐ ์นธ์ ์๋ ์ฌ๋๋ค์ด ์ด๋ค ๋ฐฉํฅ์ ์๋์ง ์ฃผ์ด์ง๋ค. ์ฌ๋๋ค์ด ํ์ดํ๋ฅผ ๋ฐ๋ผ ์ญ ์ด๋ํ์ ๋ ๋ชจ๋ ์ฌ๋์ด ์์ ๊ตฌ์ญ์ผ๋ก ๋ค์ด๊ฐ ์ ์๋๋ก ํ๋ ค๋ฉด ๋ช ๊ฐ์ ์์ ๊ตฌ์ญ์ ๋ง๋ค์ด์ผ ํ๋์ง๋ฅผ ๋ฌป๋ ๋ฌธ์ ์ด๋ค.
์์ด๋์ด
์ด ๋ฌธ์ ๋ ๊ทธ๋ํ์ ์ฌ์ดํด์ ๊ฐ์๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ์ฌ์ดํด 1๊ฐ๋น 1๊ฐ์ ์์ ๊ตฌ์ญ์ ๋ง๋ค์ด ์ฃผ๋ฉด ๋๋ค. ๊ทธ๋์ dfs๋ฅผ ํตํด ๊ทธ๋ํ๋ฅผ ์ํํ๋ฉฐ ๋ถ๋ชจ(์ฌ์ดํด์ ์์์ )๋ฅผ ๊ธฐ๋กํด์ฃผ๊ณ , ๋ง์ง๋ง์ ๋ถ๋ชจ๊ฐ ์ด ์ข ๋ฅ๊ฐ ์๋์ง๋ฅผ ๋ฆฌํดํด์คฌ๋ค.
์๋์ ๊ฒฝ์ฐ ๋ถ๋ชจ๊ฐ 2์ข ๋ฅ๊ฐ ๋์์ผ๋ 2๋ฅผ ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ค.
์ฝ๋
์ ๋ต ์ฝ๋๋ ์๋์ ๊ฐ๋ค. dfs๋ฅผ ์ด์ฉํด ์ํํ๋ฉฐ ๋ค์ ๋ธ๋ญ์ด ํ์ฌ์ ๋ถ๋ชจ๊ฐ ๋ค๋ฅด๋ค๋ฉด Unionํจ์๋ฅผ ํตํด ๋ถ๋ชจ๋ฅผ ํฉ์ณ์คฌ๋ค. Unionํจ์๋ฅผ ํตํด ๋ถ๋ชจ๋ฅผ ํฉ์น ๋ ๋ ์ค ์์ ๊ฐ์ผ๋ก ํต์ผํด์ฃผ๊ณ ์ถ์๋ฐ ์ด๋ป๊ฒ ๊ตฌํํ ๊น ํ๋ค๊ฐ y์ขํ*๊ฐ๋ก๊ธธ์ด+x์ขํ๋ก ๊ฐ์ ๋น๊ตํด์คฌ๋ค.
์ฝ๊ฒ ๋งํด ์๋์ ๊ฐ์ด ์นธ๋ณ๋ก ๋ฒํธ๋ฅผ ๋งค๊ธด ๊ฒ์ด๋ค. (๋ฌผ๋ก ๋๋ ์ข์ธก ์๋จ์ขํ๋ฅผ 1,1๋ก ์ก์์ 5๋ถํฐ ์์ํ๋ค.)
1 2 3 4
5 6 7 8
9 10 11 12
#include <iostream>
#include <vector>
#include <set>
using namespace std;
char mp[1001][1001];
int parent[2002002];
int N, M;
int findParent(int child) {
if (parent[child] != child)
parent[child] = findParent(parent[child]);
return parent[child];
}
void Union(int x, int y) {
int rootX = findParent(x);
int rootY = findParent(y);
rootX < rootY ? parent[rootY] = rootX : parent[rootX] = rootY;
}
void dfs(int y, int x) {
int curChar = mp[y][x];
int nxtY, nxtX;
if (curChar == 'U') {
nxtY = y - 1;
nxtX = x;
}
else if (curChar == 'D') {
nxtY = y + 1;
nxtX = x;
}
else if (curChar == 'R') {
nxtY = y;
nxtX = x + 1;
}
else {
nxtY = y;
nxtX = x - 1;
}
int curIdx = y * M + x;
int nxtIdx = nxtY * M + nxtX;
if (findParent(curIdx) != findParent(nxtIdx)) {
Union(curIdx, nxtIdx);
dfs(nxtY, nxtX);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> mp[i][j];
parent[i * M + j] = i * M + j;
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
if (findParent[i * M + j] == i * M + j){
dfs(i, j);
}
}
}
set<int> st;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cout<<parent[i*M+j]<<" ";
st.insert(parent[i * M + j]);
}
cout<<endl;
}
cout << st.size();
}
์ค์ํ๋ ๋ถ๋ถ
๋๋ ์ด ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ์๋ํด์ ๋ง์ท๋๋ฐ, ์๊พธ ํ๋ ธ๋ ์ด์ ๋ dfs๋ฅผ ํ ์ง ๋ง์ง ํ๋ณํ ๋ ์๊ธฐ ์์ ์ ๋ถ๋ชจ๋ฅผ parent๋ฐฐ์ด์ ํตํด ํ์ธํ๊ธฐ ๋๋ฌธ์ด์๋ค. (findParentํจ์๋ฅผ ์ด์ฉํด์ผ ํ๋ค.)
findParentํจ์๋ฅผ ํตํด ๋ถ๋ชจ๋ฅผ ํ์ธํ์ง ์์ผ๋ฉด parent๋ฐฐ์ด์ด ์ ๋๋ก ์ด๊ธฐํ ๋์ง ์๋๋ค. ์ด๋ ๊ฒ ์๋ชป ์ง๋ฉด ์๋ ์์ ๋ฅผ ํต๊ณผํ ์ ์๋ค.
์ ๋ ฅ
4 4
RRDD
RRUU
UULL
RRUU
์ ๋ต: 2
์ถ๋ ฅ: 3
ํ๋ ธ๋์ฝ๋๋ ์๋์ ๊ฐ๋ค. (mainํจ์๋ง ๋ฐ์ท)
...
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> mp[i][j];
parent[i * M + j] = i * M + j;
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
if (parent[i * M + j] == i * M + j){ //์ด๋ถ๋ถ์ findParent(i*M+j)๋ก ๊ณ ์ณ์ผํ๋ค.
dfs(i, j);
}
}
}
set<int> st;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
st.insert(parent[i * M + j]);
}
}
cout << st.size();
}
parent๋ฐฐ์ด์ ์ด์ฉํด ๋ถ๋ชจ๋ฅผ ์ฐพ์์ ๋์ findParentํจ์๋ฅผ ํตํด ๋ถ๋ชจ๋ฅผ ์ฐพ์์ ๋์ ์ฐจ์ด์ ์ ์ ๋ฐ๋ก๋ฅผ ์ด์ฉํด ํ์ธํด๋ณด์๋ค.
์ข์ธก์ด parent๋ฐฐ์ด, ์ฐ์ธก์ด findParentํจ์๋ฅผ ์ฌ์ฉํ์ ๋์ parent๋ฐฐ์ด ์ต์ข ๊ฐ์ด๋ค.
์ด๋ฐ ์ฐจ์ด๋ 18๋ฒ ๋ธ๋ญ(๋นจ๊ฐ ๋๊ทธ๋ผ๋ฏธ)์ ๋๋ฌํ์ ๋ ๋ฐ์ํ๋ค.
18๋ฒ ๋ธ๋ญ์ ๋ฐฉ๋ฌธํ์ ๋ findParentํจ์๋ฅผ ํธ์ถํ๋ฉด ํด๋น ๋ธ๋ญ์ ๊ฐ์ด 5๋ก ๋ฐ๋๊ฒ ๋๋ค. (17์ ๋ถ๋ชจ->5์ด๊ธฐ ๋๋ฌธ) ๊ทธ๋ฐ๋ฐ ๋จ์ํ parent๋ฐฐ์ด์ ์ด์ฉํด ๊ฐ์ ํ์ธํ๋ฉด 18๋ฒ ๋ธ๋ญ์ ๋ถ๋ชจ๊ฐ์ด ๊ฐฑ์ ์ด ์๋์ด ๊ฒฐ๊ณผ์ ์ผ๋ก ํ๋ฆฐ ๋ต์ด ๋์ถ๋๋ค.
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด 18๋ฒ ๋ธ๋ญ์ ๋ฐฉ๋ฌธํ ๋ ๊น์ง๋ ๋ถ๋ชจ๊ฐ 17์ด์๋๋ฐ 19๋ฒ ๋ธ๋ญ์ ๋ฐฉ๋ฌธํ ๋๋ 5๋ก ๋ถ๋ชจ๊ฐ ๊ฐฑ์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฝ๋๊ฐ ์คํ๋ ๋ ์ค๊ฐ์ค๊ฐ parent๋ฐฐ์ด์ ํ์ธํ๊ณ ์ถ๋ค๋ฉด ์๋ ์ฝ๋๋ฅผ ํตํด ํ์ธํ ์ ์๋ค.
#include <iostream>
#include <vector>
#include <set>
using namespace std;
char mp[1001][1001];
int parent[2002002];
int N, M;
int findParent(int child) {
if (parent[child] != child)
parent[child] = findParent(parent[child]);
return parent[child];
}
void Union(int x, int y) {
int rootX = findParent(x);
int rootY = findParent(y);
rootX < rootY ? parent[rootY] = rootX : parent[rootX] = rootY;
}
void dfs(int y, int x) {
int curChar = mp[y][x];
int nxtY, nxtX;
if (curChar == 'U') {
nxtY = y - 1;
nxtX = x;
}
else if (curChar == 'D') {
nxtY = y + 1;
nxtX = x;
}
else if (curChar == 'R') {
nxtY = y;
nxtX = x + 1;
}
else {
nxtY = y;
nxtX = x - 1;
}
int curIdx = y * M + x;
int nxtIdx = nxtY * M + nxtX;
if (findParent(curIdx) != findParent(nxtIdx)) {
Union(curIdx, nxtIdx);
dfs(nxtY, nxtX);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> mp[i][j];
parent[i * M + j] = i * M + j;
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cout<<"before: "<<i<<" "<<j<<" "<<i*M+j<<endl;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cout<<parent[i*M+j]<<" ";
}
cout<<endl;
}
if (parent[i * M + j] == i * M + j){ //์ด๋ถ๋ถ์ findParent(i*M+j)๋ก ํด์ผํ๋ค.
cout<<"after\\n";
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cout<<parent[i*M+j]<<" ";
}
cout<<endl;
}
dfs(i, j);
}
}
}
set<int> st;
cout<<"final\\n";
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cout<<parent[i*M+j]<<" ";
st.insert(parent[i * M + j]);
}
cout<<endl;
}
cout << st.size();
}
'Problem Solving > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 14889] ์คํํธ์ ๋งํฌ (C++) (0) | 2022.01.05 |
---|---|
[C++ ์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ2 - ๋ฐฐ๋ญ๋ฌธ์ (Knapsack Problem) (0) | 2022.01.04 |
[๋ฐฑ์ค 9461] ํ๋๋ฐ ์์ด (C++) (0) | 2021.12.03 |
[๋ฐฑ์ค 1011] Fly me to the Alpha Centauri (C++) (0) | 2021.12.02 |
[๋ฐฑ์ค 1065] ํ์ (C++) (0) | 2021.12.01 |