[프로그래머스 | 파이썬 / 자바스크립트] 게임 맵 최단거리(깊이/너비 우선 탐색(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)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기 (505)
      • 프로그래밍 (41)
        • Programming (1)
        • C | C++ (6)
        • Java (28)
        • Python (5)
      • 웹 프로그래밍 (108)
        • 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
  • 공지사항

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

  • 태그

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

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

티스토리툴바