- ํ๋ก๊ทธ๋๋จธ์ค
- js
- ์นด์นด์ค2021
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- ์๊ณ ๋ฆฌ์ฆ
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- ์ํฐ๋
- nestjs
- ์ฌ๊ท
- ๋ฐฑ์ค
- ๋นํธ๋งต
- ์ด๋ถํ์
- DP
- ํธ๋ฆฌ
- ์น๋ฆฐ์ด
- LCs
- Union-Find
- ์์ฝ๋
- go
- ๋นํธ๋ง์คํน
- DFS
- ํ๋ฆฌ์จ๋ณด๋ฉ
- golang
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋ค์ต์คํธ๋ผ
- C++
- Python
- ์นด์นด์ค ์ฝํ
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- BFS
- Today
- Total
Hello Ocean! ๐ผ
[C++/ํ๋ก๊ทธ๋๋จธ์ค] ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (2020 ์นด์นด์ค ์ธํด์ญ) ๋ณธ๋ฌธ
[C++/ํ๋ก๊ทธ๋๋จธ์ค] ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (2020 ์นด์นด์ค ์ธํด์ญ)
bba_dda 2022. 1. 18. 00:13๋ฌธ์
https://programmers.co.kr/learn/courses/30/lessons/67259
๋ฌธ์ ๋ฅผ ์์ฝํ์๋ฉด,
์ ์ฌ๊ฐํ ๋ชจ์์ board์์
(0, 0)์์ (N-1, N-1)๊น์ง ๊ฒฝ์ฃผ๋ก๋ฅผ ๊ฑด์คํ๋๋ฐ
์ง์ ๋๋ก๋ ํ ์นธ์ 100์, ์ฝ๋๋ 100+500 = 600์ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
๋ฐ๋ผ์, (0, 0)์์ (N-1, N-1)๊น์ง ๋๋ก๋ฅผ ๋ง๋ค ์ ์๋ ์ต์๋น์ฉ์ ๊ตฌํ๋ฉด ๋๋ค.
ํ์ด
board์ ์ต๋ ํฌ๊ธฐ๊ฐ 25x25์ด๋ค. -> ์์ฒญ ํฌ์ง ์์ -> ์๊ฐ๋ณต์ก๋ ๋๋
๊ทธ๋์ ์ผ๋ฐ์ ์ธ ์ต๋จ๊ฒฝ๋ก ์ฐพ๊ธฐ์ ๋ง์ด ์ฐ์ด๋ BFS๋ฅผ ์ฌ์ฉํ๋ค.
visited[r][c] ํํ์ ๋ฐฐ์ด์ [0][0] ~ [r][c] ๊น์ง์ ์ต์๋น์ฉ์ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ , Queue์ { r, c, cost, flag(๋ฐฉํฅ์ ๋ณด) }๋ฅผ ๋ด์๋ค.
๊ทธ๋ฐ๋ฐ! visited๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ์ด์ฉํ๋๋ ํ ์ผ 25๋ฒ๋ง ํ๋ฆฌ๊ฒ ๋์๋ค ใ ใ
์ง๋ฌธํ๊ธฐ์์ ํด๋ต์ ์ป์ ์ ์์๋๋ฐ,
์ง์ ์ 0(์ํ) ๋ฐฉํฅ์ผ๋ก ์ค๋ , 1(์ข์ฐ) ๋ฐฉํฅ์ผ๋ก ์ค๋ [r][c]๊น์ง ํ์ํ cost๋ ๋์ผํ ์ ์์ผ๋,
[r][c]์์ ๋ค์ ์นธ์ผ๋ก ์ด๋ค ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋๋์ ๋ฐ๋ผ ์ ๋ต์ด ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์
๋ฐฉํฅ์ ๋ณด๊น์ง ๊ตฌ๋ถํด์ ์ต์๋น์ฉ์ ์ ์ฅํด์ผ ํ๋ค๋ ๊ฒ์ด์๋ค!
๊ฒฐ๊ณผ์ ์ผ๋ก visited[r][c][flag(๋ฐฉํฅ)] ํํ๋ก ์ด์ฉํ์ฌ ์ ๋ต์ด ๋ ์ ์์๋ค.
์ด ๋ฌธ์ ์ ํ์ด๋ฅผ ๋ช ๊ฐ ์ฐพ์๋ณด๋ฉด 2์ฐจ์ ๋ฐฐ์ด๋ก ํ์ดํ ๊ฒ์ ์ฐพ์๋ณผ ์ ์๋๋ฐ, 25๋ฒ ํ ์ผ๊ฐ ์ถ๊ฐ๋๊ธฐ์ ์ ํ์ด๋ ๊ฒ ๊ฐ๋ค. (๊ทธ๋๋ก ๋ณต๋ถํ์ฌ ์ ์ถํด๋ณด๋ 25๋ฒ์ด ์ญ์ ํ๋ฆฌ๊ฒ ๋์๋ค)
์ฝ๋
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int sCost = 100; // ์ง์ ๋๋ก ๋น์ฉ
int cCost = 600; // ์ฝ๋ ๋น์ฉ
struct Node {
int r; int c; int cost; bool flag; // 0: ์ํ, 1: ์ข์ฐ
};
int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,-1,0,1 };
int BFS(vector<vector<int>> board) {
int end = board.size() - 1;
int N = board.size();
//[r][c]์ง์ ์ ์ค๋๋ฐ ํ์ํ ์ต์๋น์ฉ ์ ์ฅ
vector<vector<vector<int>>> visited(N, vector<vector<int>>(N, vector<int>(N, 987654321)));
queue<Node> q;
visited[0][0][0] = 0;
visited[0][0][1] = 0;
if (board[1][0] == 0) {
visited[1][0][0] = 100;
q.push({ 1, 0, 100, 0 }); // ์ด์ ์ ์ํ๋ฐฉํฅ
}
if (board[0][1] == 0) {
visited[0][1][1] = 100;
q.push({ 0, 1, 100, 1 }); // ์ด์ ์ ์ข์ฐ๋ฐฉํฅ
}
while (!q.empty()) {
Node temp = q.front();
q.pop();
for (int i = 0;i < 4;i++) {
int newR = temp.r + dr[i];
int newC = temp.c + dc[i];
int newCost = temp.cost;
bool newFlag = temp.flag;
if (i % 2 == (int)temp.flag) {
newCost += sCost;
}
else {
newCost += cCost;
newFlag = !newFlag;
}
if (newR < 0 || newR >= N || newC< 0 || newC >= N) continue;
if (board[newR][newC] == 1) continue;
if (visited[newR][newC][newFlag] < newCost) continue;
visited[newR][newC][newFlag] = newCost;
q.push({ newR, newC, newCost, newFlag });
}
}
return min(visited[end][end][0], visited[end][end][1]);
}
int solution(vector<vector<int>> board) {
int answer = 0;
answer = BFS(board);
return answer;
}
๊ฒฐ๊ณผ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++/ํ๋ก๊ทธ๋๋จธ์ค] ์ด์ค์ฐ์ ์์ํ (0) | 2022.03.01 |
---|---|
[go/ํ๋ก๊ทธ๋๋จธ์ค] ์ฌ ์ฐ๊ฒฐํ๊ธฐ (0) | 2022.02.08 |
[C++/ํ๋ก๊ทธ๋๋จธ์ค] ๋จ์ด ๋ณํ (0) | 2022.01.12 |
[C++/ํ๋ก๊ทธ๋๋จธ์ค] ๋ณด์ ์ผํ (2020 ์นด์นด์ค ์ธํด์ญ) (0) | 2021.12.30 |
[C++/ํ๋ก๊ทธ๋๋จธ์ค] ๋ถ๋ ์ฌ์ฉ์ (0) | 2021.12.29 |