문제요약
나의 코드 및 설명
- 레버가 있는 칸까지 탐색한 후, 도착 지점까지 있는 칸까지 탐색한다.
var dx = [0,1,0,-1];
var dy = [-1,0,1,0];
function goLever(sx,sy,lx,ly,n,m,maps,visited){
var queue = [];
queue.push([sx,sy]);
visited[sy][sx] = 1;
while (queue.length){
var [x,y] = queue.shift();
if (x == lx && y == ly) break;
for (let i = 0; i < 4; i++){
var nx = x + dx[i], ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= m || ny >= n){
continue;
} else {
if ((maps[ny][nx] == 'O' || maps[ny][nx] == 'E') && visited[ny][nx] == 0){
visited[ny][nx] = visited[y][x] + 1;
queue.push([nx,ny]);
}
else if (maps[ny][nx] == 'L' && visited[ny][nx] == 0){
visited[ny][nx] = visited[y][x] + 1;
queue.push([nx,ny]);
}
}
}
}
return visited[ly][lx]-1;
}
function goDestination(sx,sy,ex,ey,n,m,maps,check,levered){
var q = [];
q.push([sx, sy]);
check[sy][sx] = 1;
while (q.length) {
var [x,y] = q.shift();
if (x == ex && y == ey) break;
for (let i = 0; i < 4; i++){
var nx = x + dx[i], ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= m || ny >= n){
continue;
} else {
if ((maps[ny][nx] == 'O' || maps[ny][nx] == 'S') && check[ny][nx] == 0){
check[ny][nx] = check[y][x] + 1;
q.push([nx,ny]);
}
else if (maps[ny][nx] == 'E' && check[ny][nx] == 0){
check[ny][nx] = check[y][x] + 1;
q.push([nx,ny]);
}
}
}
}
return check[ey][ex] - 1;
}
function solution(maps) {
var answer = 0;
//가로 : m / 세로 : n
var n = maps.length, m = maps[0].length;
var visited = Array.from( {length : n } , () => Array(m).fill(0));
console.log(visited);
var sx = 0, sy = 0, lx = 0, ly = 0, ex = 0, ey = 0;
for (let i = 0; i < n; i++){
for (let j = 0; j < m; j++){
if (maps[i][j] == 'S') {
sx = j;
sy = i;
}
if (maps[i][j] == 'L') {
lx = j;
ly = i;
}
if (maps[i][j] == 'E') {
ex = j;
ey = i;
}
}
}
var visited = Array.from( {length : n}, () => Array(m).fill(0));
var levered = goLever(sx,sy,lx,ly,n,m,maps,visited);
if (levered == -1) answer = -1;
else {
var check = Array.from( {length : n}, () => Array(m).fill(0));
var des = goDestination(lx,ly,ex,ey,n,m,maps,check,levered);
if (des == -1) {
answer = -1;
} else {
answer = levered + des;
}
}
return answer;
}
이차원 배열 초기화 : Array.from({ length : n }, () => Array(m).fill(0))
var arr = Array.from( {length : 4}, () => Array(6).fill(0));
console.log(arr);
// [[0,0,0,0,0,0], [0,0,0,0,0,0], [0,0,0,0,0,0], [0,0,0,0,0,0]]
피드백
파이썬으로 풀어봤던 문제지만, JS로 다시 풀어보았다. 풀이과정은 파이썬으로 푸는 것과 동일하게 풀었지만, 파이썬보다 문법이 미숙하다보니 시간이 더 소요되었다. 꾸준하게 많은 문제를 풀어서 JS에 더욱 익숙해져야겠다.
'Programmers > Lv2' 카테고리의 다른 글
[프로그래머스/JS] 피보나치 수 (Lv2) (0) | 2023.08.05 |
---|---|
[프로그래머스/JS] 다음 큰 숫자 (Lv2) / num.toString() (0) | 2023.08.05 |
[프로그래머스/JS] 귤 고르기 (Lv2) (0) | 2023.08.04 |
[프로그래머스/JS] N개의 최소 공배수 (Lv2) / 유클리드 호제법 (0) | 2023.08.04 |
[프로그래머스/JS] 멀리 뛰기 (Lv2) / DP (0) | 2023.08.04 |