Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Programmers
- UE5
- 백준
- directx
- DeferredRendering
- Unreal Engine5
- 프로그래머스
- GeeksForGeeks
- 티스토리챌린지
- winapi
- RVO
- softeer
- C
- RootMotion
- baekjoon
- const
- 줄 세우기
- DirectX11
- 언리얼엔진5
- UnrealEngine4
- NRVO
- 오블완
- C++
- UnrealEngine5
- Frustum
- 팰린드롬 만들기
- 1563
- IFileDialog
- algorithm
- 2294
Archives
- Today
- Total
Game Develop
[Algorithm] Programmers :: 빛의 경로 사이클 본문
https://school.programmers.co.kr/learn/courses/30/lessons/86052
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
struct Node
{
int y;
int x;
int dir;
int count;
};
map<char, vector<int> > dirs =
{
{'L',{3,0,1,2}},
{'R',{1,2,3,0}},
{'S',{0,1,2,3}}
};
bool visited[501][501][4] = { false }; // 뻗어나가는 방향 체크.
int dir[4][2] = { {-1,0}, {0,1}, {1,0}, {0,-1} };
int maxRow = 0;
int maxCol = 0;
vector<int> solution(vector<string> grid)
{
vector<int> answer;
maxRow = grid.size();
maxCol = grid[0].size();
for (int i = 0; i < maxRow; ++i)
{
for (int j = 0; j < maxCol; ++j)
{
for (int k = 0; k < 4; ++k)
{
if (visited[i][j][k]) continue;
Node curNode = { i,j,k,0 };
visited[curNode.y][curNode.x][curNode.dir] = true;
while (1)
{
int nextY = curNode.y + dir[curNode.dir][0];
if (nextY < 0) nextY = maxRow - 1;
else if (nextY >= maxRow) nextY = 0;
int nextX = curNode.x + dir[curNode.dir][1];
if (nextX < 0) nextX = maxCol - 1;
else if (nextX >= maxCol) nextX = 0;
int nextDir = dirs[grid[nextY][nextX]][curNode.dir]; // 다음방향만 지정해주는거
int nextCount = curNode.count + 1;
if (visited[nextY][nextX][nextDir]) // 사이클완성.
{
answer.push_back(nextCount);
break;
}
else
{
visited[nextY][nextX][nextDir] = true;
curNode = { nextY,nextX,nextDir,nextCount };
}
}
}
}
}
sort(answer.begin(), answer.end());
return answer;
}
|
cs |
문제설명이 애매해서 다른 사람의 설명을 보고나서야 완벽히 이해할 수 있었다.
각 칸마다 4방향에 대해 방문탐색을 하는게 포인트다.
임의의 위치에서 임의의 방향에 대해 이전에 방문한적 없다면 그곳이 출발노드이다.
이후 조건에 따라 이동을하면서 방향에 대해 전부 방문체크를 해주고, '같은 노드의 같은 방향'을 만날 경우 사이클이 형성됐으니 종료시켜주면 된다.
'Algorithm > Programmers' 카테고리의 다른 글
[Algorithm] Programmers :: 할인 행사 (0) | 2023.06.05 |
---|---|
[Algorithm] Programmers :: n^2 배열 자르기 (0) | 2023.06.05 |
[Algorithm] Programmers :: 2개 이하로 다른 비트 (0) | 2023.06.04 |
[Algorithm] Programmers :: 거리두기 확인하기 (0) | 2023.06.04 |
[Algorithm] Programmers :: 이진 변환 반복 (0) | 2023.06.04 |