[프로그래머스 | 파이썬 / 자바스크립트] 게임 맵 최단거리(깊이/너비 우선 탐색(DFS/BFS)/level 2)

2023. 4. 10. 21:54·Problem Solving/프로그래머스
반응형
문제

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
'Problem Solving/프로그래머스' 카테고리의 다른 글
  • [프로그래머스|파이썬] 공원 산책 (연습문제/level 1)
  • [프로그래머스|파이썬] 달리기 경주 (연습문제/level 1)
  • [프로그래머스 | 파이썬 / 자바스크립트] 타겟 넘버(깊이/너비 우선 탐색(DFS/BFS)/level 2)
  • [프로그래머스 | 파이썬 / 자바스크립트] 스킬트리(Summer/Winter Coding(~2018) / level 2)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기 (506)
      • 프로그래밍 (41)
        • Programming (1)
        • C | C++ (6)
        • Java (28)
        • Python (5)
      • 웹 프로그래밍 (2)
        • HTML | CSS (5)
        • JavaScript | TypeScript (41)
        • React (25)
        • Vue.js (0)
        • Next.js (18)
        • Spring & Spring Boot (13)
        • JSP & Servlet (1)
        • DB (4)
      • 웹 프로젝트 (77)
        • 웹 프로젝트 (22)
        • 🥨스낵몰 (3)
        • 👨‍👨‍👧‍👧소셜 가계부 (26)
        • 🌜꿈 일기장 (11)
        • 🔮포트폴리오 사이트 (11)
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램 (0)
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼 (0)
        • 😺Just Meow It: 조언 사이트 (2)
        • 📕Workly: 교대근무 다이어리 (1)
      • 앱 프로그래밍 (26)
        • Flutter (24)
        • Kotlin (2)
      • Problem Solving (166)
        • 백준 (52)
        • 프로그래머스 (79)
        • SWEA (29)
      • Computer Science (40)
        • 알고리즘 (14)
        • 컴퓨터 네트워크 (18)
        • 이산수학 (8)
      • Developer (47)
        • 후기 (4)
        • 자료정리 (4)
        • 취업 | 취준 (9)
        • SSAFY (1)
        • 웹개발 교육 프로그램 (9)
        • TIL (20)
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    포트폴리오
    프로그래머스
    백준
    Til
    자바
    구현
    Next.js
    리액트
    웹사이트
    spring boot
    파이썬
    AWS
    bfs
    프로젝트
    강의내용정리
    컴퓨터네트워크
    Jiraynor Programming
    React
    클론 프로젝트
    공식문서
    플러터
    알고리즘
    ZeroCho
    SWEA
    d3
    자바스크립트
    mysql
    뉴렉처
    타입스크립트
    블로그 제작
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[프로그래머스 | 파이썬 / 자바스크립트] 게임 맵 최단거리(깊이/너비 우선 탐색(DFS/BFS)/level 2)
상단으로

티스토리툴바