반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/1844
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🐍파이썬
from collections import deque def solution(maps): n = len(maps) #행 m = len(maps[0]) #열 #이동할 좌표, 상하좌우 dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] def bfs(x, y): queue = deque() queue.append((x, y)) while queue: x, y = queue.popleft() for i in range(4): #상하좌우를 확인하며 이동할 수 있는 좌표를 확인 nx = x + dx[i] ny = y + dy[i] if nx >= n or ny >= m or nx < 0 or ny < 0: #배열의 범위를 벗어난 경우 continue if maps[nx][ny] == 0: #막다른 길 continue if maps[nx][ny] == 1: #옳은 길을 찾은 경우 maps[nx][ny] = maps[x][y] + 1 #이전 칸의 값 + 1을 새로 발견한 칸에 대입해 이동횟수를 체크 queue.append((nx, ny)) if nx == n-1 and ny == m-1: #오른쪽 끝에 도달한 경우 return maps[nx][ny] #이동횟수를 리턴 return -1 #오른쪽 끝에 도달하지 못한 경우 -1 리턴 return bfs(0, 0) #왼쪽끝(0,0)부터 bfs 시작
다른 풀이 방법
from collections import deque def solution(maps): x_move = [1, 0, -1, 0] y_move = [0, 1, 0, -1] x_h, y_h = (len(maps[0]), len(maps)) queue = deque([(0, 0, 1)]) #x, y, depth while queue: x, y, d = queue.popleft() for i in range(4): nx = x + x_move[i] ny = y + y_move[i] if nx > -1 and ny > -1 and nx < x_h and ny < y_h: #배열의 범위를 벗어나지 않는 경우 if maps[ny][nx] == 1 or maps[ny][nx] > d + 1: #막다른 길이 아닌 경우 maps[ny][nx] = d + 1 #깊이추가 if nx == x_h - 1 and ny == y_h - 1: #목표지점에 도착하면 return d + 1 #현재까지의 깊이 + 1을 리턴 queue.append((nx, ny, d + 1)) return -1
🐥자바스크립트
function solution(maps) { n = maps.length m = maps[0].length let dx = [-1, 1, 0, 0] let dy = [0, 0, -1, 1] function bfs(x, y){ queue = [[x, y]] maps[x][y] = 1 while (queue.length > 0){ [x, y] = queue.shift() //구조분해 할당 for(let i = 0; i < 4; i++){ let nx = x + dx[i] let ny = y + dy[i] if (nx >= n || ny >= m || nx < 0 || ny < 0){ continue; } if (maps[nx][ny] === 0){ continue } if (maps[nx][ny] === 1){ maps[nx][ny] = maps[x][y] + 1 queue.push([nx, ny]) } if (nx === n-1 && ny === m-1){ return maps[nx][ny] } } } return -1 } return bfs(0,0); }
다른 풀이 방법
function solution(maps) { var yLen = maps.length - 1; var xLen = maps[0].length - 1; var queue = [[0, 0]]; var visited = Array.from(new Array(maps.length), () => new Array(maps[0].length).fill(false)); var result = 0; while (queue.length) { result++; #이동횟수 체크 var size = queue.length; for (var i = 0; i < size; i++) { #큐에 든 원소의 갯수만큼 dfs 반복 var point = queue.shift(); var curY = point[0]; var curX = point[1]; if (visited[curY][curX]) continue; #방문한 경로인 경우 건너뛰기 #방문한 경로가 아닌 경우 maps[curY][curX] = 0; #1을 0으로 덮어씌우기 visited[curY][curX] = true; #방문처리 if (curY === yLen && curX === xLen) return result; #목표지점 도달시 result 리턴 #상하좌우를 확인하며 이동 if (curY < yLen && maps[curY + 1][curX] === 1) queue.push([curY + 1, curX]) if (curX < xLen && maps[curY][curX + 1] === 1) queue.push([curY, curX + 1]) if (curY > 0 && maps[curY - 1][curX] === 1) queue.push([curY - 1, curX]) if (curX > 0 && maps[curY][curX - 1] === 1) queue.push([curY, curX - 1]) } } return -1; }
반응형
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스|파이썬] 베스트앨범 (해시/level 3) (0) | 2023.04.29 |
---|---|
[프로그래머스|파이썬] 공원 산책 (연습문제/level 1) (0) | 2023.04.28 |
[프로그래머스|파이썬] 달리기 경주 (연습문제/level 1) (0) | 2023.04.27 |
[프로그래머스 | 파이썬 / 자바스크립트] 타겟 넘버(깊이/너비 우선 탐색(DFS/BFS)/level 2) (0) | 2023.04.02 |
[프로그래머스 | 파이썬 / 자바스크립트] 스킬트리(Summer/Winter Coding(~2018) / level 2) (0) | 2023.04.02 |
[프로그래머스 | 파이썬 / 자바스크립트] 추억 점수(연습문제 / level 1) (0) | 2023.03.31 |