학습(0)/C++ 문제풀이
프로.2.방문 길이
누가 뭐래도 개발자
2025. 2. 26. 01:36
또또또 이전과 같은 방식으로하다가 털렸다.
gemini에게 물어봐서 경로 구하는 법을 알게되었다.
이제 좀 이해하자.
경로를 구해야 하는데 좌표를 이용하는 벡터를 사용했다.
그리고 자바 때를 보면 배열로도 못 풀 문제는 아니지만, 더 쉽고 간단한 방법을 배웠다.
#include <string>
#include <vector>
using namespace std;
int solution(string dirs) {
int answer = 0;
int x = 5, y = 5;
vector<vector<bool>> map(11, vector<bool>(11, 0));
for (auto dir : dirs)
{
if (false == map[y][x])
++answer;
map[y][x] = true;
switch (dir)
{
case 'U':
if (y - 1 >= 0) y -= 1;
break;
case 'D':
if (y + 1 <= 11) y += 1;
break;
case 'L':
if (x - 1 >= 0) x -= 1;
break;
case 'R':
if (x + 1 <= 11) x += 1;
break;
}
}
return answer;
}
set || map 쌍 좌표를 이용해서 중복을 제거한다. (라고 하지만 중복제거를 활용하진 않음;)
#include <string>
#include <set>
using namespace std;
int solution(string dirs) {
int answer = 0;
int x = 0, y = 0;
//못풀어서 찾아봄
set<pair<pair<int, int>, pair<int, int>>> path;
for (auto dir : dirs)
{
int nx = x, ny = y;
if ('U' == dir) --ny;
else if ('D' == dir) ++ny;
else if ('L' == dir) --nx;
else if ('R' == dir) ++nx;
if (nx < -5 || nx > 5 || ny < -5 || ny > 5) continue;
if (path.find({ {x,y} ,{nx,ny} }) == path.end() &&
path.find({ {nx,ny} ,{x,y} }) == path.end())
{
path.insert({ {x,y}, {nx,ny} });
++answer;
}
x = nx;
y = ny;
}
return answer;
}
배열 이용한 방법
int dy[4] = {0, 0, 1, -1}; // R - L - D - U
int dx[4] = {1, -1, 0, 0};
bool check[11][11][11][11] = {0};
int solution(string dirs)
{
int answer = 0;
int y = 5;
int x = 5;
memset(check, false, sizeof(check));
for(int i=0; i<dirs.length(); ++i) {
int dir;
if(dirs[i]=='R') dir = 0;
else if(dirs[i]=='L') dir = 1;
else if(dirs[i]=='D') dir = 2;
else if(dirs[i]=='U') dir = 3;
int ny = y + dy[dir];
int nx = x + dx[dir];
if(ny < 0 || nx < 0 || ny > 10 || nx > 10) {
continue;
}
if(!check[y][x][ny][nx]) {
answer++;
check[y][x][ny][nx] = check[ny][nx][y][x] = true;
}
y = ny;
x = nx;
}
return answer;
}
책에서는 3차원배열을 이용해서 3번째 인덱스에 방향값 (옵션 1,2,3,4)을 주어 방문을 체크함.