RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Algorithm/프로그래머스

[프로그래머스 > Lv2] 미로탈출

2023. 2. 16. 20:37
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제

최대한 빠르게 미로를 빠져나가는데 걸리는 시간을 구하려 합니다.

 

[입력]

- 미로를 나타내는 문자열 배열 maps

 

[결과]

- 미로를 탈출하는데 필요한 최소 시간 return

(* 만약 탈출할 수 없다면 -1을 return)

 

2. 풀이

간단하게 bfs를 수행하는 별도의 함수를 만들어두고 아래의 두 최소 이동 거리를 계산하였습니다.

  1. 시작점 -> 레버
  2. 레버 -> 출구

만약 1과 2 중 하나라도 도착하지 못하는 상황이라면 -1을 반환해주고

그렇지 않다면 1 + 2를 반환해주면 됩니다.

 

bfs 메서드는 일반 너비우선탐색 코드와 동일하기 때문에 어려움 없이 구현할 수 있습니다. 

 

3. 코드

Python
dx = [-1,0,1,0]
dy = [0,1,0,-1]
def solution(maps):
    answer = 0
    n, m = len(maps), len(maps[0])
    start_x, start_y = 0,0
    end_x, end_y = 0,0
    level_x, level_y = 0,0
    
    for x in range(n):
        for y in range(m):
            if maps[x][y]=='S':
                start_x,start_y = x,y
            elif maps[x][y]=='L':
                level_x,level_y = x,y
            elif maps[x][y]=='E':
                end_x,end_y = x,y
    
    to_level = bfs(start_x,start_y,level_x,level_y,maps,n,m)
    if to_level == 0: return -1
    to_end = bfs(level_x,level_y,end_x,end_y,maps,n,m)
    if to_end == 0: return -1
    return to_level + to_end

def bfs(
    start_x,start_y,
    end_x, end_y,
    maps, n, m
):
    q = []
    q.append((start_x,start_y, 0))
    visited = [[False] * m for _ in range(n)]
    visited[start_x][start_y] = True
    
    while q:
        x, y, distance = q.pop(0)
        
        if x==end_x and y==end_y:
            return distance
        
        for d in range(4):
            nx, ny = x+dx[d], y+dy[d]
            if 0<=nx<n and 0<=ny<m and maps[nx][ny]!='X' and not visited[nx][ny]:
                visited[nx][ny] = True
                q.append((nx,ny,distance+1))
        
    return 0
반응형

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스 > Lv2] 덧칠하기  (0) 2023.03.04
[프로그래머스 > Lv2] 혼자서 하는 틱택토  (0) 2023.03.03
[프로그래머스 > Lv1] 카드뭉치  (0) 2023.02.16
[프로그래머스 > Lv3] 표현 가능한 이진트리  (0) 2023.02.10
[프로그래머스>Lv3] 인사고과 - kotlin  (0) 2023.02.09
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스 > Lv2] 덧칠하기
    • [프로그래머스 > Lv2] 혼자서 하는 틱택토
    • [프로그래머스 > Lv1] 카드뭉치
    • [프로그래머스 > Lv3] 표현 가능한 이진트리
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바