Level 2️⃣ - 리코쳇 로봇
2024. 4. 25. 15:20ㆍ알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/169199
🚀문제 접근
bfs 탐색을 생각할 수 있는데 장애물을 만나거나 범위에 벗어날 때까지는 쭉 미끄러져야한다.
이 부분을 구현하는 것이 어려웠다.
그리고 항상 visited 배열을 이용해서 최단거리를 구했는데 count라는 변수를 이용해서 목적지점까지의 최단거리를 구할 수 있다.
조금 변형되어도 스스로 느끼기에 난이도가 확 높아진 느낌이다. 더 많은 문제를 풀어봐야겠다.
function solution(board) {
let answer = -1;
const map = board.map((item)=> item.split(""));
const n = map.length;
const m = map[0].length;
const visited = Array.from({length: n}, ()=>Array.from({length: m}).fill(0));
const dy = [-1, 0, 1, 0];
const dx = [0, 1, 0, -1];
// 시작 지점 찾기
let sy, sx;
for(let i = 0; i<n; i++){
for(let j = 0; j<m; j++){
if(map[i][j] === 'R'){
sy = i;
sx = j;
}
}
}
// bfs 탐색
const queue = [[sy, sx, 0]];
visited[sy][sx] = 1;
while(queue.length){
const [y, x, count] = queue.shift();
if(map[y][x] === 'G'){
answer = count;
break;
}
for(let i = 0; i<4; i++){
let ny = y + dy[i];
let nx = x + dx[i];
// 미끄러지기
while(ny>=0 && ny<n && nx>=0 && nx<m && map[ny][nx] !=='D'){
ny += dy[i];
nx += dx[i];
}
// 장애물을 만나거나 범위에 벗어났을 때는 빠꾸
ny -= dy[i];
nx -= dx[i];
// 해당 지점을 방문하지 않았을 때는 방문처리하고 큐에 집어넣어서 이 지점을 기준으로 다시 탐색
if(!visited[ny][nx]){
queue.push([ny, nx, count+1]);
visited[ny][nx] = 1;
}
}
}
return answer;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 2️⃣ - 테이블 해시 함수 (0) | 2024.05.20 |
---|---|
Level 2️⃣ - 캐시 (2018 KAKAO BLIND RECRUITMENT) (0) | 2024.05.16 |
Level 2️⃣ - 수식 최대화 (0) | 2024.04.24 |
Level 2️⃣ - 숫자카드 나누기 (0) | 2024.04.23 |
Level 2️⃣ - 방금그곡 (1) | 2024.04.23 |