Algorithm/Programmers
[Algorithm] Programmers :: 리코쳇 로봇
MaxLevel
2023. 6. 17. 07:16
https://school.programmers.co.kr/learn/courses/30/lessons/169199
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
|
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
|
struct Node
{
int y;
int x;
int count;
};
int dir[4][2] = { {-1,0}, {1,0}, {0,-1}, {0,1} };
bool visited[101][101] = { false };
int solution(vector<string> board)
{
int answer = -1;
int row = board.size();
int col = board[0].size();
queue<Node> q;
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
if (board[i][j] == 'R')
{
q.push({ i,j,0 });
visited[i][j] = true;
break;
}
}
}
while (!q.empty())
{
int curY = q.front().y;
int curX = q.front().x;
int curCount = q.front().count;
q.pop();
if (board[curY][curX] == 'G') return curCount;
for (int i = 0; i < 4; ++i)
{
int tempY = curY;
int tempX = curX;
while (1)
{
int nextY = tempY + dir[i][0];
int nextX = tempX + dir[i][1];
if (nextY < 0 || nextY >= row || nextX < 0 || nextX >= col || board[nextY][nextX] == 'D')
{
if (visited[tempY][tempX]) break;
visited[tempY][tempX] = true;
q.push({ tempY,tempX,curCount + 1 });
break;
}
else
{
tempY = nextY;
tempX = nextX;
}
}
}
}
return answer;
}
|
cs |
특정지점에 도달할 수 있는 최소한의 횟수를 구하는 문제이다.
그래서 기본적인 접근은 BFS로 했으며, 이 문제같은 경우는 조건이 하나 더 달려있다.
board의 벽이나 'D'를 만나기 전까지는 계속해서 미끄러지듯이 이동하는 것이다.
미끄러지듯이 이동할 때는 카운팅을 하지않는다. 즉, 멈춰섰을 때 다음움직임을 할때 카운팅을 하면 된다.
처음에는 미끄러지듯이 이동하는것도 한칸씩 큐에 넣는식으로 했더니 전체 테스트케이스중에서 3,4개정도 자꾸 틀리길래 시간 좀 많이 소비했다. 테스트케이스들을 찾아서해도 해결이 안되길래 아예 지우고 다시 짰다.
생각해보니 미끄러지듯이 이동하는거는 굳이 한칸씩 넣을필요 없이 바로 처리가 가능하며 코드도 훨씬 깔끔하기 때문에 해당방식으로 다시 구현했다.
은근히 이런 유형도 꽤 나오는것 같아서 백준의 비슷한유형의 문제를 더 풀어봐야겠다.