- ํ๋ฆฌ์จ๋ณด๋ฉ
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐฑ์ค
- Python
- LCs
- ํธ๋ฆฌ
- golang
- C++
- ์น๋ฆฐ์ด
- ๋ค์ต์คํธ๋ผ
- ์ด๋ถํ์
- ์์ฝ๋
- ๋นํธ๋ง์คํน
- BFS
- ์นด์นด์ค2021
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- DP
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- ์ํฐ๋
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ๋นํธ๋งต
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- ์นด์นด์ค ์ฝํ
- go
- ์ฌ๊ท
- ์๊ณ ๋ฆฌ์ฆ
- js
- nestjs
- DFS
- Union-Find
- Today
- Total
Hello Ocean! ๐ผ
[๋ฐฑ์ค/C++] 1175. ๋ฐฐ๋ฌ ๋ณธ๋ฌธ
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์ด์ ์ ๋ฌผ์ ๋ชจ๋ ํฌ์ฅํ ๋ฏผ์์ด๋ ์ด์ ์ ๋ฌผ์ ๋ฐฐ๋ฌํ๋ ค๊ณ ํ๋ค. ๋ฏผ์์ด๊ฐ ์ ๋ฌผ์ ๋ฐฐ๋ฌํ ๊ณณ์ ์ด ๋ฌธ์ ๋ฅผ ์ฝ๋ ์ฌ๋๋ค์ด ์์ ์๋ ๊ต์ค์ด๋ค. ๊ต์ค์ ์ง์ฌ๊ฐํ๋ชจ์์ด๊ณ , ๋ชจ๋ ๊ฐ์ ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ๋ธ๋ก์ผ๋ก ๋๋์ด์ ธ ์๋ค.
์ ๋ ฅ์ผ๋ก ๊ต์ค์ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์ ์ฌ๊ฐํ ๋ธ๋ก์ ๋ค์๊ณผ ๊ฐ์ด 4๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
- S : ์ง๊ธ ๋ฏผ์์ด๊ฐ ์๋ ๊ณณ์ด๋ค. ์ด๊ณณ์ด ๋ฏผ์์ด๊ฐ ๋ฐฐ๋ฌ์ ์์ํ๋ ๊ณณ์ด๋ค.
- C : ๋ฏผ์์ด๊ฐ ๋ฐ๋์ ์ ๋ฌผ์ ๋ฐฐ๋ฌํด์ผ ํ๋ ๊ณณ์ด๋ค. ์ด๋ฌํ ๋ธ๋ก์ ์ ํํ๊ฒ 2๊ฐ ์๋ค.
- # : ๋ฏผ์์ด๊ฐ ๊ฐ ์ ์๋ ๊ณณ์ด๋ค.
- . : ๋ฏผ์์ด๊ฐ ์์ ๋กญ๊ฒ ์ง๋๊ฐ ์ ์๋ ๊ณณ์ด๋ค.
๋ฏผ์์ด๊ฐ ํ ๋ธ๋ก ๋์๋จ๋ถ์ผ๋ก ์ด๋ํ๋๋ฐ๋ 1๋ถ์ด ๊ฑธ๋ฆฐ๋ค. ๋ฏผ์์ด๋ ๋ค๊ฐ์ง ๋ฐฉํฅ ์ค ํ๋๋ก ์ด๋ํ ์ ์์ผ๋ฉฐ, ๊ต์ค์ ๋ฒ์ด๋ ์ ์๋ค. ๋ฏผ์์ด๊ฐ ์ ๋ฌผ์ ๋ฐฐ๋ฌํด์ผ ํ๋ ๊ณณ์ ๋ค์ด๊ฐ ๋, ๋ฏผ์์ด๋ ๊ทธ ๊ณณ์ ์๋ ์ฌ๋ ๋ชจ๋์๊ฒ ์ ๋ฌผ์ ์ ๋ฌํด์ผ ํ๋ค. ์ด ์ํฉ์ ๋์์ ์ผ์ด๋๋ฉฐ, ์ถ๊ฐ์ ์ธ ์๊ฐ์ด ์์๋์ง ์๋๋ค.
๋ฏผ์์ด๋ ์ด๋ ๋๊ตฌ๋ ์์ ์ ๋ณด์ง ์์์ผ๋ฉด ํ๊ธฐ ๋๋ฌธ์, ๋ฉ์ถ์ง ์๊ณ ๋งค ์๊ฐ๋ง๋ค ๋ฐฉํฅ์ ๋ฐ๊ฟ์ผ ํ๋ค. ์ด ๋ง์ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋ ๋ฒ ์ฐ์์ผ๋ก ์ด๋ํ ์ ์๋ค๋ ๋ง์ด๋ค. ๋ฏผ์์ด๊ฐ ์ ๋ฌผ์ ๋ชจ๋ ๋ฐฐ๋ฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ต์ค์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. N๊ณผ M์ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ต์ค์ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฏผ์์ด๊ฐ ์ ๋ฌผ์ ๋ชจ๋ ๋ฐฐ๋ฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๋ถ๊ฐ๋ฅ ํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
ํ์ด
์ด ๋ฌธ์ ๊ฐ ์ผ๋ฐ์ ์ธ ์ต๋จ๊ฒฝ๋ก์ฐพ๊ธฐ ๋ฌธ์ ์ ๋ค๋ฅธ ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ฐ์์ผ๋ก ์ด๋ํ ์ ์๋ค.
- ์ ๋ฌผ์ ๋ ๊ตฐ๋ฐ์ ๋ฐฐ๋ฌํด์ผ ํ๋ค (๋ ๊ฐ์ ๋์ฐฉ์ง๋ฅผ ๋ชจ๋ ์ฐ์ด์ผ ์๋ฃ)
๋ฐ๋ผ์ ๊ธฐ์กด์ BFS ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋๋ก ์ ์ฉํ ์ ์์ด ๋ณํ์ด ํ์ํ๋ค.
์ค๋ณต ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ฉด, queue๊ฐ ๋น ๊ฒ์ผ๋ก ๋ถ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์๋ค.
(queue๊ฐ ํ์ ๋น์ด์์ ์ผ์ด ์๊ธฐ ๋๋ฌธ)
๋ฐ๋ผ์ "์ด๋ป๊ฒ ๋ถ๊ฐ๋ฅํ ์ผ์ด์ค์ธ์ง๋ฅผ ํ๋จํ๋๊ฐ"๊ฐ ๊ฐ์ฅ ํฐ ๊ฑธ๋ฆผ๋์ด ๋์๋ค.
ํด๋น ์นธ์ ์ค๋ณต ์ ๊ทผ ํ์๋ฅผ ๋ฌด์ ํ์ด ์๋๋ผ 1000, 10000 ๋ฑ์ผ๋ก ์ฃผ์ด๋ณด์๋๋ฐ,
์ซ์๊ฐ ์์ผ๋ฉด "ํ๋ ธ์ต๋๋ค"
์ซ์๊ฐ ์ปค์ง๋ฉด "๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ"์ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.
๋ฐ๋ผ์ ์๋์ ๋งํฌ์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํ์๋ค.
sweetday-alice.tistory.com/177
visited ๋ฐฐ์ด์ ์ฌ์ฉํ๋, ๊ธฐ์กด์ visited[r][c] ์์ visited[r][c][๋ฐฉํฅ][1๋ฒ๋์ฐฉ์ง์ ๋ฐฉ๋ฌธ ์ฌ๋ถ][2๋ฒ๋์ฐฉ์ง์ ๋ฐฉ๋ฌธ ์ฌ๋ถ] ๋ก ์ผ์ด์ค๋ฅผ ์ธ๋ถํํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด์๋ค.
์ด๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋, ์ง๋์์ C๋ก ํ์๋ ๋ ๊ฐ์ ๋์ฐฉ์ ์ ๋ค๋ฅด๊ฒ ์๋ณํ ํ์๊ฐ ์์๋ค. ๋ฐ๋ผ์ ์ง๋์์ ํ๋์ C๋ฅผ D๋ก ๋ฐ๊พธ์ด์ค ๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ฝ๋
#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
#include <memory.h>
using namespace std;
#define U 1
#define D 2
#define L 3
#define R 4
struct node {
int x;
int y;
int count;
int dir;
int visited_C;
int visited_D;
};
int dfs(vector<vector<char>> table, int n, int m, int startN, int startM) {
bool visited[50][50][5][2][2];
memset(visited, false, sizeof(visited));
int count = -1;
queue<node> q;
node start = { startM, startN, 0, 0, 0, 0};
q.push(start);
while (!q.empty()) {
node temp = q.front();
q.pop();
// ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด pass
if (visited[temp.y][temp.x][temp.dir][temp.visited_C][temp.visited_D])
continue;
// ํ์ฌ ์์น๊ฐ ๋ฐฐ๋ฌ์ง์ธ์ง ํ์ธ
if (table[temp.y][temp.x] == 'C')
temp.visited_C = 1;
if (table[temp.y][temp.x] == 'D')
temp.visited_D = 1;
// ์ ๋ฌผ์ ๋ชจ๋ ๋ฐฐ๋ฌํ๋์ง ํ์ธ
if (temp.visited_C == 1 && temp.visited_D == 1)
return temp.count;
//ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ ํ์
visited[temp.y][temp.x][temp.dir][temp.visited_C][temp.visited_D] = true;
//ํ์ฌ ๋
ธ๋์์ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ ๋
ธ๋ ์ฐพ๊ธฐ
if (temp.dir != 1 && temp.y > 0) // UP
if (table[temp.y - 1][temp.x] != '#')
q.push({ temp.x, temp.y - 1, temp.count + 1, U, temp.visited_C, temp.visited_D });
if (temp.dir != 2 && temp.y < n - 1) // DOWN
if (table[temp.y + 1][temp.x] != '#')
q.push({ temp.x, temp.y + 1,temp.count + 1, D, temp.visited_C, temp.visited_D });
if (temp.dir != 3 && temp.x > 0) // LEFT
if (table[temp.y][temp.x - 1] != '#')
q.push({ temp.x - 1, temp.y,temp.count + 1, L, temp.visited_C, temp.visited_D });
if (temp.dir != 4 && temp.x < m-1) // RIGHT
if (table[temp.y][temp.x + 1] != '#')
q.push({ temp.x + 1, temp.y,temp.count + 1, R, temp.visited_C, temp.visited_D });
}
return count;
}
int main(void) {
int n, m;
vector<vector<char>> classroom;
int startN, startM;
cin >> n >> m;
int idxC = 0;
for (int i = 0;i < n;i++) {
string s;
cin >> s;
vector<char> temp(s.begin(), s.end());
vector<char>::iterator iter1 = find(temp.begin(), temp.end(), 'S');
if (iter1 != temp.end()) {
startN = i;
startM = distance(temp.begin(), iter1);
}
vector<char>::iterator iter2 = find(temp.begin(), temp.end(), 'C');
while (iter2 != temp.end()) {
idxC++;
if (idxC == 2)
temp[distance(temp.begin(), iter2)] = 'D';
iter2 = find(iter2+1, temp.end(), 'C');
}
classroom.push_back(temp);
}
cout << dfs(classroom, n, m, startN, startM) << endl;
return 0;
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 1520. ๋ด๋ฆฌ๋ง ๊ธธ (0) | 2021.03.14 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค/C++] ํฉ์น ํ์ ์๊ธ (0) | 2021.03.01 |
[ํ๋ก๊ทธ๋๋จธ์ค/C++] ์ ๊ท ์์ด๋ ์ถ์ฒ (0) | 2021.02.08 |
[ํ๋ก๊ทธ๋๋จธ์ค/C++] ๋งค์นญ ์ ์ (0) | 2021.02.03 |
[C++] struct์ class์ ์ฐจ์ด (0) | 2021.01.25 |