//์ด ๊ธ์ ์ด๊ณณ์ ๋ฌธ์ ๋ค์ ์ญ ํ๋ฉฐ ํ์์ ๊ธฐ๋ณธ์ ๋ค์ง๋ ๊ณผ์ ์ ์ ์์ต๋๋ค.
#1 ๋ฐฑ์ค 1260๋ฒ DFS์ BFS
DFS์ BFS์ Hello World! ์ ๋์ ๋ฌธ์ .
ํ์ง๋ง...๋ ์ด๊ฒ์กฐ์ฐจ ๊ฐ๋จํ ํ์ง ๋ชปํ๋ค. ๊ทธ๋๋ ํธ๋ ๊ณผ์ ์์ ๊ฐ๋
์ ๋ฆฌ๊ฐ ํ์คํ๊ฒ ๋๋ฏํด์ ์ข์๋ ๋ฌธ์ !
๋จผ์ , ๋ด ๊ธฐ์ต์์ BFS์ DFS๋ฅผ ๋๋ฌ๋๋ฌ ํ๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
void DFS(int v) {
visited[v] = 1;
cout << v << ' ';
for (int i = 0; i < graph01[v].size(); i++) {
int next = graph01[v][i];
if (visited[next] == 0 ) {
DFS(next);
}
}
}
void BFS(int v) {
queue<int> q;
q.push(v);
visited2[v] = 1;
while(!q.empty()){
int x = q.front();
q.pop();
cout << x << ' ';
for (int i = 0; i < graph01[x].size(); i++) {
int next = graph01[x][i];
if (visited2[next] == 0) {
q.push(next);
visited2[next] = 1;
}
}
}
์ ์ํ visited, visited2 ๋ฐฐ์ด์ ์ ์ธํด ๊ฐ๊ฐ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ ์๊ณ , ์ฒซ๋ฒ์งธ ์ผ์ด์ค๋ ๋ฌด๋ํ๊ฒ ํต๊ณผํ๋๋ฏ ์ถ์๋ค.


ํ์ง๋ง,,,, ๋๋ฒ์งธ ํ ์คํธ ์ผ์ด์ค์์๋ ใ ใ ..


..?๋ฌด์์ด ๋ฌธ์ ์ฃ ..? ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์ ๊ฐ ์๋๊ฒ ๊ฐ์๋ฐ์??? ์ ๋ ๋ฐฐ์ด ๊ทธ๋๋ก ์ผ์ด์!!!
๋ฌธ์ ๋ ์
๋ ฅ๋ถ์ ์์๋ค.
for (int i = 0; i < M; i++) {
int tmp1, tmp2;
cin >> tmp1 >> tmp2;
graph01[tmp1].push_back(tmp2);
//graph01[tmp2].push_back(tmp1); <-๊ฐ๋จํ ์๋๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
}
graph01์ ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํด ๋์๊ฑด๋ฐ, ํฌ์ธํธ๋ ์ด๊ฒ ์๋ฐฉํฅ ๊ทธ๋ํ์๋ค๋ ์ ์ด๋ค.
์๋ฐฉํฅ ๊ทธ๋ํ๋ ๊ฐ์ ์ ์ถ๊ฐํด์ค๋ ์ ์ ์ ์ ๋งํฌ์์ผ์ค์ผ ํ๋ค.
์ ์ฝ๋๋๋ก๋ผ๋ฉด, 5์ 1์ ๋งํฌ์ํฌ๋, 5์์ 1๋ก ๊ฐ๋ ๊ฐ์ ์ ์์ง๋ง 1์์ 5๋ก ๊ฐ๋ ๊ฐ์ ์ ์๋ค๋ ์๊ธฐ.
ํ๋ ๋ฌธ์ ๋ ๊ทธ๋ฟ๋ง์ด ์๋์๋๋ฐ..


์ด๋ฒ์๋ ์์๊ฐ ๋ฌธ์ ์๋ค.
์ ์ ์ ๋ฐฉ๋ฌธํ ๋ ํน๋ณํ ๊ท์น์ด ์๋ค๋ฉด ๊ฐ์ด ์ ์ ์ ์ ๋ถํฐ ๋ฐฉ๋ฌธํ๋๊ฒ ์ผ๋ฐ์ ์ด๊ณ , ์ด ๋ฌธ์ ์์๋ ๊ทธ๊ฑธ ์๊ตฌํ๊ณ ์๋ค.
๊ทธ๋..๋ด ์ฝ๋๋ ์ ๋ ฌ๊ฐ์๊ฑด ํ์ง ์์์ง.
์ ๋ ฌ๋ง ํ๋ค๋ฉด ๊ฐ๋จํ ํด๊ฒฐ ๋ ๋ฌธ์ ์ง๋ง, ๋ c++์์ ์ ๊ณตํ๋ sort() ํจ์์ ๋ฌธ์ ์ ๋๋ฌธ์ ์ฆ๊ฒจ ์ฌ์ฉํ์ง ์๋๋ค.
(c++์ sort()๋ ํต์ ๋ ฌ์ด์ง๋ง, ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์๋์๋ ๋ฌ๋ผ์ง ์ ์๊ณ , ๊ทธ๋ก์ธํด ์ธ๋ฑ์ค๋ ๋ถ๊ท์นํด ์ง ์ํ์ฑ์ด ์๋ค. ์ด๋ ์ ์ฒดํ์ํ ๋๋ ๋ฌธ์ ๊ฐ ์์์๋ ์์ง๋ง, ๊ณต๊ฐ๋ณต์ก๋๋ ์ธ๋ฑ์ค๋ฅผ ์ง์ ์ ๊ทผํ ๋๋ ์ฌ๋ฌ๋ชจ๋ก ์ํํ๋ค๊ณ ์๊ฐํ๋ค.)
sort()๋ฅผ ์จ์ ํด๊ฒฐํ๋ค.
for (int i = 1; i <= N; i++) {
sort(graph01[i].begin(), graph01[i].end());
}


ํ์ง๋ง sort()๋ฅผ ์ฐ๊ณ ์ถ์ง๋ ์์๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์๊น ์๊ฐํ๋ค๊ฐ, ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํ๋ฉด ์ข์๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ฒ์ฉ!
์ธ์ ํ๋ ฌ์ ์ธ๋ฑ์ค์ ์ง์ ์ ๊ทผํด ๊ฐ์ ์ ์ถ๊ฐํด ์ฃผ๋ ์์ด๊ธฐ ๋๋ฌธ์, ๋ฐ๋ณต๋ฌธ์ ๋๋ฆด๋ ๋ฎ์ ์ธ๋ฑ์ค๋ถํฐ ํ์ํ๋ค๋ฉด
์ ๋ ฌ๊ณผ์ ์ด ๊ตณ์ด ํ์ ์์๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๋ฐ๋ก ์ค์ฒํด๋ณด์!
int graph[1001][1001] = { 0 }; //์
๋ ฅ ํฌ๊ธฐ๊ฐ 1000๊น์ง ์ด๊ธฐ ๋๋ฌธ์ ํฐ ๋ฌธ์ ๋ ์์๋ฏ ์ถ๋ค.
int main()
{
cin >> N >> M >> V;
for (int i = 0; i < M; i++) {
int tmp1, tmp2;
cin >> tmp1 >> tmp2;
graph[tmp1][tmp2] = 1;
graph[tmp2][tmp1] = 1;
}
DFS(V);
cout << endl;
BFS(V);
}
void DFS(int v) {
visited[v] = true;
cout << v << ' ';
for (int i = 1; i <=N; i++) {
if (graph[v][i]&& !visited[i]){
DFS(i);
}
}
}
void BFS(int v) {
queue<int> q;
q.push(v);
visited2[v] = 1;
while(!q.empty()){
int x = q.front();
q.pop();
visited2[x] = true;
cout << x << ' ';
for (int i = 1; i <= N; i++) {
if (graph[x][i] && !visited2[i]) {
q.push(i);
visited2[i] = 1;
}
}
}
}
์ฝ๋๋ฅผ ์ง๋ ์ค, ์ธ์ ํ๋ ฌ์ ์ธ์ ๋ฆฌ์คํธ์๋ ๋ค๋ฅด๊ฒ
๋ค์ ๋ฐฉ๋ฌธํ ์ ์ ์ ๋ฒํธ๋ฅผ ์ ์ฅํด์ฃผ๋ next๋ฑ์ ๋ณ์๊ฐ ํ์ ์์๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๊ณ , ๊ทธ๊ฒ์ ์๋ง ์ณ์ ์๊ฐ์ด์๋๊ฒ ๊ฐ๋ค.
์ธ์ ๋ฆฌ์คํธ๋ ๊ฐ์ ์ด ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ๋ฐ๋ก ๋ค์ ์ ์ ์ ๋ฒํธ๋ฅผ ์๋ ค์ฃผ์ง๋ง, ์ธ์ ํ๋ ฌ์ ๋จ์ํ ์ ์ ๊ฐ์ ๊ฐ์ ์ ๋ฌด๋ง ์๋ ค์ค๊ณผ ๋์์ ์ด๋ฏธ ๋ฐ๋ณต๋ฌธ ์์ ๊ทธ ์ญํ ์ ํ๋ ๋ณ์๊ฐ ์์ผ๋ฏ๋ก,,,



#2 ๋ฐฑ์ค 1303๋ฒ ์ ์ - ์ ํฌ
์ด๋ ค์ ๋ณด์ด์ง ์์์ง๋ง...์กฐ๊ธ ํด๋งธ๋ค.
๋ง์ ํ์ ๋ฌธ์ ๋ค์ด flood fill ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ด ๋ฌธ์ ๋ flood fill ์๊ณ ๋ฆฌ์ฆ์ ์์ฉ์ธ๋ฏ.
(flood fill ์๊ณ ๋ฆฌ์ฆ์ ์ด๊ณณ์์ ์ดํด๋ณผ์ ์๋ค. ๊ตฌํ์ DFS / BFS ๋ ๋ค ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.)
๊ตฌ์์ ๊ฐ๋จ. ๊ฐ ์ขํ๋ณ๋ก flood fill ์๊ณ ๋ฆฌ์ฆ์ ๋๋ ค์ ๊ฐ ๋จ๊ณ๊ฐ ๋๋๋ฉด ๋ณ์ฌ์์ ์ ๊ณฑ์ ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํ๋ฉด ๋.
ํ์ง๋ง ์ด ๋ฌธ์ ๋ ํจ์ ์ด ์์์ผ๋..



๋ฐ๋ก ์
๋ ฅ๋ถ๋ฅผ ์๋ชป ๋ง๋ค์๋ค(....)
ํญ์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํ ๋์๋ ๊ฐ๋ก์ธ๋ก ์
๋ ฅ์ ์ฃผ์ํ ๊ฒ!
์ด๊ฒ๋๋ฌธ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌด์จ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ฐธ ํด๋งธ๋ค. ๊ทธ๋ฅ ์
๋ ฅ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ ๊ฐ๋จํ ์ค์๊ฐ ๋ช์๊ฐ์ ์ก์๋จน์๋์ง..
#include <iostream>
#include <stdio.h>
using namespace std;
int N, M, resultW = 0, resultB = 0;
char map[101][101] = { 0, };
bool visited01[101][101] = { 0, };
bool visited02[101][101] = { 0, };
int DFSW(int x, int y) {
if (x<0 && x>N && y<0 && y>M && map[x][y] == 'B')
return 0;
if (map[x][y] == 'W' && visited01[x][y] == false) {
visited01[x][y] = true;
return DFSW(x + 1, y) + DFSW(x - 1, y) + DFSW(x, y + 1) + DFSW(x, y - 1) + 1;
}
return 0;
}
int DFSB(int x, int y) {
if (x<0 && x>N && y<0 && y>M && map[x][y] == 'W')
return 0;
if (map[x][y] == 'B' && visited02[x][y] == false) {
visited02[x][y] = true;
return DFSB(x + 1, y) + DFSB(x - 1, y) + DFSB(x, y + 1) + DFSB(x, y - 1) + 1;
}
return 0;
}
int main() {
cin >> N >> M;
cin.ignore();
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
char tmp = '0';
scanf("%c", &tmp);
map[i][j] = tmp;
}
cin.ignore();
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (!visited01[i][j]) {
int tmp01 = DFSW(i, j);
tmp01 = tmp01 * tmp01;
resultW += tmp01;
}
if (!visited02[i][j]) {
int tmp02 = DFSB(i, j);
tmp02 = tmp02 * tmp02;
resultB += tmp02;
}
}
}
cout << resultW << ' ' << resultB << endl;
return 0;
}
ํจ์๋ฅผ ํ๋๋ง ์ธ์ ์์์ง๋ง ๊ท์ฐฎ์์ ๊ทธ๋ฅ ๋๋์์ต๋๋ค. ํคํค

#3 ๋ฐฑ์ค 2178๋ฒ ๋ฏธ๋ก ํ์
ํ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ !
์ํธ๋ก ํด๋ฆฌ์ดํ๊ธฐ๋๋ฌธ์ ํ๊ณ ๋์ ๊ธฐ๋ถ์ด ์ ๋ง ์ข์๋ค ใ
ใ
ใ
ํ์์์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ ์ฃผ๋ก BFS๋ฅผ ์ด์ฉํ๋ฉด ํธํ๋ค.
DFS์ ์ฌ๊ท๊ตฌ์กฐ๋ ์ด๋ฐ ๊ฐ๋จํ ๋ฌธ์ ๋ ์
๋ ฅ์ด ์ปค์ง๋ฉด ์๊ฐ๋ณต์ก๋๊ฐ ๊ธ๊ฒฉํ๊ฒ ๋์ด๋๊ธฐ ๋๋ฌธ์, ์คํ์ค๋ฒํ๋ก๋ฑ์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๋ค.
int BFS(int x, int y) {
queue<pair<int, int>> q;
q.push(pair<int, int>(x, y));
while (!q.empty()) {
x = q.front().first;
y = q.front().second;
if (x == N - 1 && y == M - 1) break;
q.pop();
visited[x][y] = true;
for (int i = 0; i < 4; i++) {
if (maze[x + dx[i]][y + dy[i]] !=0 //์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ตฌํด์ง ์นธ์ด๊ฑฐ๋
&& x + dx[i] >= 0 //๋ฏธ๋ก๋ฅผ ๋์ด์๋ ์นธ์ด๊ฑฐ๋
&& x + dx[i] < N
&& y + dy[i] >=0
&& y + dy[i] < M
&&!visited[x + dx[i]][y + dy[i]]) { //์ด๋ฏธ ๋ฐฉ๋ฌธํ ์นธ์ด๊ฑฐ๋
q.push(pair<int, int>(x + dx[i], y + dy[i]));
visited[x + dx[i]][y + dy[i]] = true;
maze[x + dx[i]][y + dy[i]] = maze[x][y] + 1;
}
}
}
return maze[N - 1][M - 1];
}
์ขํ๋ฅผ ์ด์ฉํด์ ํธ๋ ๋ฌธ์ ๋ c++์์ ์ ๊ณตํ๋ utilty ํค๋์ pair์ queue๋ฅผ ์์ด ์ฌ์ฉํ๋ฉด ํ๊ธฐ ์ฉ์ดํ๋ค.
pair๋ ํ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ํ์ ๋ฃ์ด์ฃผ๋๋ฐ ์ฌ์ฉํ๋ค.
๊ตฌ์์ ๊ฐ๋จ. BFS์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ญ์๋ฐฉํฅ์ผ๋ก ํ์ํ๋ฉฐ ๋ฒฝ ๋ฑ์ ์ ํ์ด ๊ฑธ๋ ค์๋ ์นธ์ ํ์ ๋ฃ์ง ์๋ ์์ด๋ค.
๋ฏธ๋ก์ ์ฐ์ธก ์ตํ๋จ ์นธ์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ตฌํด์ ธ ์์ผ๋ฏ๋ก, ์ตํ๋จ ์นธ์ ๊ฐ์ ๋ฆฌํด!


'learnings > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๋คํธ ๊ฒ์ (0) | 2024.04.01 |
---|---|
[๋ฐฑ์ค] 2458 ํค ์์ (0) | 2021.08.03 |
[PS/ํ์/BFS/DFS] ์ฌ๊ธฐ์ ๊ธฐ ์ด๊ณณ์ ๊ณณ ํ์ํ์ (0) | 2021.07.18 |
[PS/๊ทธ๋ฆฌ๋/ํ๋ก๊ทธ๋๋จธ์ค] ์ฒด์ก๋ณต (0) | 2021.07.02 |
[PS/๊ทธ๋ฆฌ๋/์ฝ๋์ ] 3120 : ๋ฆฌ๋ชจ์ปจ (0) | 2021.06.30 |
//์ด ๊ธ์ ์ด๊ณณ์ ๋ฌธ์ ๋ค์ ์ญ ํ๋ฉฐ ํ์์ ๊ธฐ๋ณธ์ ๋ค์ง๋ ๊ณผ์ ์ ์ ์์ต๋๋ค.
#1 ๋ฐฑ์ค 1260๋ฒ DFS์ BFS
DFS์ BFS์ Hello World! ์ ๋์ ๋ฌธ์ .
ํ์ง๋ง...๋ ์ด๊ฒ์กฐ์ฐจ ๊ฐ๋จํ ํ์ง ๋ชปํ๋ค. ๊ทธ๋๋ ํธ๋ ๊ณผ์ ์์ ๊ฐ๋
์ ๋ฆฌ๊ฐ ํ์คํ๊ฒ ๋๋ฏํด์ ์ข์๋ ๋ฌธ์ !
๋จผ์ , ๋ด ๊ธฐ์ต์์ BFS์ DFS๋ฅผ ๋๋ฌ๋๋ฌ ํ๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
void DFS(int v) {
visited[v] = 1;
cout << v << ' ';
for (int i = 0; i < graph01[v].size(); i++) {
int next = graph01[v][i];
if (visited[next] == 0 ) {
DFS(next);
}
}
}
void BFS(int v) {
queue<int> q;
q.push(v);
visited2[v] = 1;
while(!q.empty()){
int x = q.front();
q.pop();
cout << x << ' ';
for (int i = 0; i < graph01[x].size(); i++) {
int next = graph01[x][i];
if (visited2[next] == 0) {
q.push(next);
visited2[next] = 1;
}
}
}
์ ์ํ visited, visited2 ๋ฐฐ์ด์ ์ ์ธํด ๊ฐ๊ฐ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ ์๊ณ , ์ฒซ๋ฒ์งธ ์ผ์ด์ค๋ ๋ฌด๋ํ๊ฒ ํต๊ณผํ๋๋ฏ ์ถ์๋ค.


ํ์ง๋ง,,,, ๋๋ฒ์งธ ํ ์คํธ ์ผ์ด์ค์์๋ ใ ใ ..


..?๋ฌด์์ด ๋ฌธ์ ์ฃ ..? ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์ ๊ฐ ์๋๊ฒ ๊ฐ์๋ฐ์??? ์ ๋ ๋ฐฐ์ด ๊ทธ๋๋ก ์ผ์ด์!!!
๋ฌธ์ ๋ ์
๋ ฅ๋ถ์ ์์๋ค.
for (int i = 0; i < M; i++) {
int tmp1, tmp2;
cin >> tmp1 >> tmp2;
graph01[tmp1].push_back(tmp2);
//graph01[tmp2].push_back(tmp1); <-๊ฐ๋จํ ์๋๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
}
graph01์ ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํด ๋์๊ฑด๋ฐ, ํฌ์ธํธ๋ ์ด๊ฒ ์๋ฐฉํฅ ๊ทธ๋ํ์๋ค๋ ์ ์ด๋ค.
์๋ฐฉํฅ ๊ทธ๋ํ๋ ๊ฐ์ ์ ์ถ๊ฐํด์ค๋ ์ ์ ์ ์ ๋งํฌ์์ผ์ค์ผ ํ๋ค.
์ ์ฝ๋๋๋ก๋ผ๋ฉด, 5์ 1์ ๋งํฌ์ํฌ๋, 5์์ 1๋ก ๊ฐ๋ ๊ฐ์ ์ ์์ง๋ง 1์์ 5๋ก ๊ฐ๋ ๊ฐ์ ์ ์๋ค๋ ์๊ธฐ.
ํ๋ ๋ฌธ์ ๋ ๊ทธ๋ฟ๋ง์ด ์๋์๋๋ฐ..


์ด๋ฒ์๋ ์์๊ฐ ๋ฌธ์ ์๋ค.
์ ์ ์ ๋ฐฉ๋ฌธํ ๋ ํน๋ณํ ๊ท์น์ด ์๋ค๋ฉด ๊ฐ์ด ์ ์ ์ ์ ๋ถํฐ ๋ฐฉ๋ฌธํ๋๊ฒ ์ผ๋ฐ์ ์ด๊ณ , ์ด ๋ฌธ์ ์์๋ ๊ทธ๊ฑธ ์๊ตฌํ๊ณ ์๋ค.
๊ทธ๋..๋ด ์ฝ๋๋ ์ ๋ ฌ๊ฐ์๊ฑด ํ์ง ์์์ง.
์ ๋ ฌ๋ง ํ๋ค๋ฉด ๊ฐ๋จํ ํด๊ฒฐ ๋ ๋ฌธ์ ์ง๋ง, ๋ c++์์ ์ ๊ณตํ๋ sort() ํจ์์ ๋ฌธ์ ์ ๋๋ฌธ์ ์ฆ๊ฒจ ์ฌ์ฉํ์ง ์๋๋ค.
(c++์ sort()๋ ํต์ ๋ ฌ์ด์ง๋ง, ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์๋์๋ ๋ฌ๋ผ์ง ์ ์๊ณ , ๊ทธ๋ก์ธํด ์ธ๋ฑ์ค๋ ๋ถ๊ท์นํด ์ง ์ํ์ฑ์ด ์๋ค. ์ด๋ ์ ์ฒดํ์ํ ๋๋ ๋ฌธ์ ๊ฐ ์์์๋ ์์ง๋ง, ๊ณต๊ฐ๋ณต์ก๋๋ ์ธ๋ฑ์ค๋ฅผ ์ง์ ์ ๊ทผํ ๋๋ ์ฌ๋ฌ๋ชจ๋ก ์ํํ๋ค๊ณ ์๊ฐํ๋ค.)
sort()๋ฅผ ์จ์ ํด๊ฒฐํ๋ค.
for (int i = 1; i <= N; i++) {
sort(graph01[i].begin(), graph01[i].end());
}


ํ์ง๋ง sort()๋ฅผ ์ฐ๊ณ ์ถ์ง๋ ์์๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์๊น ์๊ฐํ๋ค๊ฐ, ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํ๋ฉด ์ข์๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ฒ์ฉ!
์ธ์ ํ๋ ฌ์ ์ธ๋ฑ์ค์ ์ง์ ์ ๊ทผํด ๊ฐ์ ์ ์ถ๊ฐํด ์ฃผ๋ ์์ด๊ธฐ ๋๋ฌธ์, ๋ฐ๋ณต๋ฌธ์ ๋๋ฆด๋ ๋ฎ์ ์ธ๋ฑ์ค๋ถํฐ ํ์ํ๋ค๋ฉด
์ ๋ ฌ๊ณผ์ ์ด ๊ตณ์ด ํ์ ์์๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๋ฐ๋ก ์ค์ฒํด๋ณด์!
int graph[1001][1001] = { 0 }; //์
๋ ฅ ํฌ๊ธฐ๊ฐ 1000๊น์ง ์ด๊ธฐ ๋๋ฌธ์ ํฐ ๋ฌธ์ ๋ ์์๋ฏ ์ถ๋ค.
int main()
{
cin >> N >> M >> V;
for (int i = 0; i < M; i++) {
int tmp1, tmp2;
cin >> tmp1 >> tmp2;
graph[tmp1][tmp2] = 1;
graph[tmp2][tmp1] = 1;
}
DFS(V);
cout << endl;
BFS(V);
}
void DFS(int v) {
visited[v] = true;
cout << v << ' ';
for (int i = 1; i <=N; i++) {
if (graph[v][i]&& !visited[i]){
DFS(i);
}
}
}
void BFS(int v) {
queue<int> q;
q.push(v);
visited2[v] = 1;
while(!q.empty()){
int x = q.front();
q.pop();
visited2[x] = true;
cout << x << ' ';
for (int i = 1; i <= N; i++) {
if (graph[x][i] && !visited2[i]) {
q.push(i);
visited2[i] = 1;
}
}
}
}
์ฝ๋๋ฅผ ์ง๋ ์ค, ์ธ์ ํ๋ ฌ์ ์ธ์ ๋ฆฌ์คํธ์๋ ๋ค๋ฅด๊ฒ
๋ค์ ๋ฐฉ๋ฌธํ ์ ์ ์ ๋ฒํธ๋ฅผ ์ ์ฅํด์ฃผ๋ next๋ฑ์ ๋ณ์๊ฐ ํ์ ์์๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๊ณ , ๊ทธ๊ฒ์ ์๋ง ์ณ์ ์๊ฐ์ด์๋๊ฒ ๊ฐ๋ค.
์ธ์ ๋ฆฌ์คํธ๋ ๊ฐ์ ์ด ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ๋ฐ๋ก ๋ค์ ์ ์ ์ ๋ฒํธ๋ฅผ ์๋ ค์ฃผ์ง๋ง, ์ธ์ ํ๋ ฌ์ ๋จ์ํ ์ ์ ๊ฐ์ ๊ฐ์ ์ ๋ฌด๋ง ์๋ ค์ค๊ณผ ๋์์ ์ด๋ฏธ ๋ฐ๋ณต๋ฌธ ์์ ๊ทธ ์ญํ ์ ํ๋ ๋ณ์๊ฐ ์์ผ๋ฏ๋ก,,,



#2 ๋ฐฑ์ค 1303๋ฒ ์ ์ - ์ ํฌ
์ด๋ ค์ ๋ณด์ด์ง ์์์ง๋ง...์กฐ๊ธ ํด๋งธ๋ค.
๋ง์ ํ์ ๋ฌธ์ ๋ค์ด flood fill ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ด ๋ฌธ์ ๋ flood fill ์๊ณ ๋ฆฌ์ฆ์ ์์ฉ์ธ๋ฏ.
(flood fill ์๊ณ ๋ฆฌ์ฆ์ ์ด๊ณณ์์ ์ดํด๋ณผ์ ์๋ค. ๊ตฌํ์ DFS / BFS ๋ ๋ค ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.)
๊ตฌ์์ ๊ฐ๋จ. ๊ฐ ์ขํ๋ณ๋ก flood fill ์๊ณ ๋ฆฌ์ฆ์ ๋๋ ค์ ๊ฐ ๋จ๊ณ๊ฐ ๋๋๋ฉด ๋ณ์ฌ์์ ์ ๊ณฑ์ ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํ๋ฉด ๋.
ํ์ง๋ง ์ด ๋ฌธ์ ๋ ํจ์ ์ด ์์์ผ๋..



๋ฐ๋ก ์
๋ ฅ๋ถ๋ฅผ ์๋ชป ๋ง๋ค์๋ค(....)
ํญ์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํ ๋์๋ ๊ฐ๋ก์ธ๋ก ์
๋ ฅ์ ์ฃผ์ํ ๊ฒ!
์ด๊ฒ๋๋ฌธ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌด์จ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ฐธ ํด๋งธ๋ค. ๊ทธ๋ฅ ์
๋ ฅ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ ๊ฐ๋จํ ์ค์๊ฐ ๋ช์๊ฐ์ ์ก์๋จน์๋์ง..
#include <iostream>
#include <stdio.h>
using namespace std;
int N, M, resultW = 0, resultB = 0;
char map[101][101] = { 0, };
bool visited01[101][101] = { 0, };
bool visited02[101][101] = { 0, };
int DFSW(int x, int y) {
if (x<0 && x>N && y<0 && y>M && map[x][y] == 'B')
return 0;
if (map[x][y] == 'W' && visited01[x][y] == false) {
visited01[x][y] = true;
return DFSW(x + 1, y) + DFSW(x - 1, y) + DFSW(x, y + 1) + DFSW(x, y - 1) + 1;
}
return 0;
}
int DFSB(int x, int y) {
if (x<0 && x>N && y<0 && y>M && map[x][y] == 'W')
return 0;
if (map[x][y] == 'B' && visited02[x][y] == false) {
visited02[x][y] = true;
return DFSB(x + 1, y) + DFSB(x - 1, y) + DFSB(x, y + 1) + DFSB(x, y - 1) + 1;
}
return 0;
}
int main() {
cin >> N >> M;
cin.ignore();
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
char tmp = '0';
scanf("%c", &tmp);
map[i][j] = tmp;
}
cin.ignore();
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (!visited01[i][j]) {
int tmp01 = DFSW(i, j);
tmp01 = tmp01 * tmp01;
resultW += tmp01;
}
if (!visited02[i][j]) {
int tmp02 = DFSB(i, j);
tmp02 = tmp02 * tmp02;
resultB += tmp02;
}
}
}
cout << resultW << ' ' << resultB << endl;
return 0;
}
ํจ์๋ฅผ ํ๋๋ง ์ธ์ ์์์ง๋ง ๊ท์ฐฎ์์ ๊ทธ๋ฅ ๋๋์์ต๋๋ค. ํคํค

#3 ๋ฐฑ์ค 2178๋ฒ ๋ฏธ๋ก ํ์
ํ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ !
์ํธ๋ก ํด๋ฆฌ์ดํ๊ธฐ๋๋ฌธ์ ํ๊ณ ๋์ ๊ธฐ๋ถ์ด ์ ๋ง ์ข์๋ค ใ
ใ
ใ
ํ์์์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ ์ฃผ๋ก BFS๋ฅผ ์ด์ฉํ๋ฉด ํธํ๋ค.
DFS์ ์ฌ๊ท๊ตฌ์กฐ๋ ์ด๋ฐ ๊ฐ๋จํ ๋ฌธ์ ๋ ์
๋ ฅ์ด ์ปค์ง๋ฉด ์๊ฐ๋ณต์ก๋๊ฐ ๊ธ๊ฒฉํ๊ฒ ๋์ด๋๊ธฐ ๋๋ฌธ์, ์คํ์ค๋ฒํ๋ก๋ฑ์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๋ค.
int BFS(int x, int y) {
queue<pair<int, int>> q;
q.push(pair<int, int>(x, y));
while (!q.empty()) {
x = q.front().first;
y = q.front().second;
if (x == N - 1 && y == M - 1) break;
q.pop();
visited[x][y] = true;
for (int i = 0; i < 4; i++) {
if (maze[x + dx[i]][y + dy[i]] !=0 //์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ตฌํด์ง ์นธ์ด๊ฑฐ๋
&& x + dx[i] >= 0 //๋ฏธ๋ก๋ฅผ ๋์ด์๋ ์นธ์ด๊ฑฐ๋
&& x + dx[i] < N
&& y + dy[i] >=0
&& y + dy[i] < M
&&!visited[x + dx[i]][y + dy[i]]) { //์ด๋ฏธ ๋ฐฉ๋ฌธํ ์นธ์ด๊ฑฐ๋
q.push(pair<int, int>(x + dx[i], y + dy[i]));
visited[x + dx[i]][y + dy[i]] = true;
maze[x + dx[i]][y + dy[i]] = maze[x][y] + 1;
}
}
}
return maze[N - 1][M - 1];
}
์ขํ๋ฅผ ์ด์ฉํด์ ํธ๋ ๋ฌธ์ ๋ c++์์ ์ ๊ณตํ๋ utilty ํค๋์ pair์ queue๋ฅผ ์์ด ์ฌ์ฉํ๋ฉด ํ๊ธฐ ์ฉ์ดํ๋ค.
pair๋ ํ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ํ์ ๋ฃ์ด์ฃผ๋๋ฐ ์ฌ์ฉํ๋ค.
๊ตฌ์์ ๊ฐ๋จ. BFS์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ญ์๋ฐฉํฅ์ผ๋ก ํ์ํ๋ฉฐ ๋ฒฝ ๋ฑ์ ์ ํ์ด ๊ฑธ๋ ค์๋ ์นธ์ ํ์ ๋ฃ์ง ์๋ ์์ด๋ค.
๋ฏธ๋ก์ ์ฐ์ธก ์ตํ๋จ ์นธ์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ตฌํด์ ธ ์์ผ๋ฏ๋ก, ์ตํ๋จ ์นธ์ ๊ฐ์ ๋ฆฌํด!


'learnings > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๋คํธ ๊ฒ์ (0) | 2024.04.01 |
---|---|
[๋ฐฑ์ค] 2458 ํค ์์ (0) | 2021.08.03 |
[PS/ํ์/BFS/DFS] ์ฌ๊ธฐ์ ๊ธฐ ์ด๊ณณ์ ๊ณณ ํ์ํ์ (0) | 2021.07.18 |
[PS/๊ทธ๋ฆฌ๋/ํ๋ก๊ทธ๋๋จธ์ค] ์ฒด์ก๋ณต (0) | 2021.07.02 |
[PS/๊ทธ๋ฆฌ๋/์ฝ๋์ ] 3120 : ๋ฆฌ๋ชจ์ปจ (0) | 2021.06.30 |