๋ฌธ์ ์ค๋ช
n x m ๊ฒฉ์ ๋ฏธ๋ก๊ฐ ์ฃผ์ด์ง๋๋ค. ๋น์ ์ ๋ฏธ๋ก์ (x, y)์์ ์ถ๋ฐํด (r, c)๋ก ์ด๋ํด์ ํ์ถํด์ผ ํฉ๋๋ค.
๋จ, ๋ฏธ๋ก๋ฅผ ํ์ถํ๋ ์กฐ๊ฑด์ด ์ธ ๊ฐ์ง ์์ต๋๋ค.
- ๊ฒฉ์์ ๋ฐ๊นฅ์ผ๋ก๋ ๋๊ฐ ์ ์์ต๋๋ค.
- (x, y)์์ (r, c)๊น์ง ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ์ด k์ฌ์ผ ํฉ๋๋ค. ์ด๋, (x, y)์ (r, c)๊ฒฉ์๋ฅผ ํฌํจํด, ๊ฐ์ ๊ฒฉ์๋ฅผ ๋ ๋ฒ ์ด์ ๋ฐฉ๋ฌธํด๋ ๋ฉ๋๋ค.
- ๋ฏธ๋ก์์ ํ์ถํ ๊ฒฝ๋ก๋ฅผ ๋ฌธ์์ด๋ก ๋ํ๋์ ๋, ๋ฌธ์์ด์ด ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก๋ก ํ์ถํด์ผ ํฉ๋๋ค.
์ด๋ ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์์ด๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
- l: ์ผ์ชฝ์ผ๋ก ํ ์นธ ์ด๋
- r: ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ด๋
- u: ์์ชฝ์ผ๋ก ํ ์นธ ์ด๋
- d: ์๋์ชฝ์ผ๋ก ํ ์นธ ์ด๋
์๋ฅผ ๋ค์ด, ์ผ์ชฝ์ผ๋ก ํ ์นธ, ์๋ก ํ ์นธ, ์ผ์ชฝ์ผ๋ก ํ ์นธ ์์ง์๋ค๋ฉด, ๋ฌธ์์ด "lul"๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
๋ฏธ๋ก์์๋ ์ธ์ ํ ์, ํ, ์ข, ์ฐ ๊ฒฉ์๋ก ํ ์นธ์ฉ ์ด๋ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด 3 x 4 ๊ฒฉ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
.... ..S. E...
๋ฏธ๋ก์ ์ข์ธก ์๋จ์ (1, 1)์ด๊ณ ์ฐ์ธก ํ๋จ์ (3, 4)์ ๋๋ค. .์ ๋น ๊ณต๊ฐ, S๋ ์ถ๋ฐ ์ง์ , E๋ ํ์ถ ์ง์ ์ ๋๋ค.
ํ์ถ๊น์ง ์ด๋ํด์ผ ํ๋ ๊ฑฐ๋ฆฌ k๊ฐ 5๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๋ก๋ก ํ์ถํ ์ ์์ต๋๋ค.
- lldud
- ulldd
- rdlll
- dllrl
- dllud
- ...
์ด๋ dllrl๋ณด๋ค ์ฌ์ ์์ผ๋ก ๋น ๋ฅธ ๊ฒฝ๋ก๋ก ํ์ถํ ์๋ ์์ต๋๋ค.
๊ฒฉ์์ ํฌ๊ธฐ๋ฅผ ๋ปํ๋ ์ ์ n, m, ์ถ๋ฐ ์์น๋ฅผ ๋ปํ๋ ์ ์ x, y, ํ์ถ ์ง์ ์ ๋ปํ๋ ์ ์ r, c, ํ์ถ๊น์ง ์ด๋ํด์ผ ํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ปํ๋ ์ ์ k๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ด๋, ๋ฏธ๋ก๋ฅผ ํ์ถํ๊ธฐ ์ํ ๊ฒฝ๋ก๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์. ๋จ, ์ ์กฐ๊ฑด๋๋ก ๋ฏธ๋ก๋ฅผ ํ์ถํ ์ ์๋ ๊ฒฝ์ฐ "impossible"์ return ํด์ผ ํฉ๋๋ค.
๋ด ํ์ด
์ฌ๊ท DFS๋ก ํ ์ ์๋ ๋ฌธ์ ๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ฌ๊ท๊ฐ ์ฝํด์ ์๊ฐ์ด ์ข ์ค๋ ๊ฑธ๋ ธ๋ค…ใ
๐ก์ด ๋ฌธ์ ์ ํฌ์ธํธ
- ๋จ์ ์ด๋ ํ์์์ ๋ชฉํ๊น์ง ๊ฑฐ๋ฆฌ์์ ๋บ ์๊ฐ 0๋ณด๋ค ์๊ฑฐ๋ ํ์๋ฉด ์คํจ๋ก ์ฒ๋ฆฌํ๋ค.
- (๋จ์ ์ด๋ ํ์ - ๋ชฉํ๊น์ง ๊ฑฐ๋ฆฌ) : ๋ชฉํ ์ง์ ์ ๋์ฐฉ ํ ๋จ์ ์ด๋ ํ์
- ๋ชฉํ ์ง์ ์ ๋์ฐฉ ํ ๋จ์ ์ด๋ ํ์ < 0 : ๋ชฉํ ์ง์ ์ ๋๋ฌํ์ง ๋ชปํจ
- ๋ชฉํ ์ง์ ์ ๋์ฐฉ ํ ๋จ์ ์ด๋ ํ์ == ํ์ : ๋จ์ ์ด๋ ํ์ ์๋ชจ๋ฅผ ์ํด ๋ค๋ฅธ ์นธ์ผ๋ก ๊ฐ๋ค๊ฐ ๋ค์ ๋์์์ผ ํ๋๋ฐ, ํ์๋ฉด ๋ค์ ๋์์ฌ ์ ์๋ค.
- (๋จ์ ์ด๋ ํ์ - ๋ชฉํ๊น์ง ๊ฑฐ๋ฆฌ) : ๋ชฉํ ์ง์ ์ ๋์ฐฉ ํ ๋จ์ ์ด๋ ํ์
- ๋ค์ ์ด๋ ์์๋ฅผ ๊ฒฐ์ ํ ๋ ์ฌ์ ์์ผ๋ก ๋น ๋ฅธ ๋ฐฉํฅ๋ถํฐ ์ด๋ํ๋ค.
- d → l → r → u ์์ผ๋ก ์ด๋ํด์ผ ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ด๋ํ ์ ์๋ค.
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
string answer = "impossible";
bool isArrived = false;
int limit = 0;
pair<int, int> maze_size;
pair<int, int> start;
pair<int, int> goal;
int dx[] = {1, 0, 0, -1};
int dy[] = {0, -1, 1, 0};
char d[] = {'d', 'l', 'r', 'u'}; // ์ฌ์ ์์ผ๋ก ๋น ๋ฅด๊ฒ
int GetDist(pair<int, int> cur)
{
return abs(goal.first - cur.first) + abs(goal.second - cur.second);
}
void dfs(int count, pair<int, int> cur, string path)
{
if(isArrived)
return;
// ๋จ์ ๊ฑฐ๋ฆฌ๊ฐ 0๋ณด๋ค ์๊ฑฐ๋ ํ์๋ฉด ์คํจ
if((limit-count-GetDist(cur)) < 0
|| (limit-count-GetDist(cur))%2 == 1)
return;
// ๋์ฐฉ ์ง์ ์ ๋์ฐฉํ๋ค๋ฉด ์ฑ๊ณต
if(count == limit)
{
if(cur == goal)
{
isArrived = true;
answer = path;
}
return;
}
// ์ด๋
for(int i = 0; i < 4; ++i)
{
int nx = cur.first + dx[i];
int ny = cur.second + dy[i];
if(nx <= 0 || nx > maze_size.first
|| ny <= 0 || ny > maze_size.second)
continue;
path += d[i];
dfs(count+1, make_pair(nx, ny), path);
path.pop_back();
}
}
string solution(int n, int m, int x, int y, int r, int c, int k)
{
maze_size = make_pair(n, m);
start = make_pair(x,y);
goal = make_pair(r,c);
limit = k;
dfs(0, start, "");
return answer;
}
'๐ฅ๏ธ Study Note > Coding Test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค]level.3 - ๋ฑ์ฐ์ฝ์ค ์ ํ๊ธฐ (C++) (1) | 2023.09.18 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค]level.3 - ์๊ณผ ๋๋ (C++) (0) | 2023.09.14 |
[BOJ 11657] ๋ฐฑ์ค ํ์๋จธ์ - C++ ํ์ด (0) | 2023.09.06 |
[ํ๋ก๊ทธ๋๋จธ์ค]level.3 - ์์ (C++) (0) | 2023.09.05 |
[ํ๋ก๊ทธ๋๋จธ์ค]level.3 - ํฉ์น ํ์ ์๊ธ (C++) (0) | 2023.09.05 |