https://school.programmers.co.kr/learn/courses/30/lessons/159993
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
from collections import deque
def solution(maps):
def is_range(x, y):
if 0 <= x < n and 0 <= y < m:
return True
else:
return False
def find(start, end):
visited = [[0 for _ in range(m)] for _ in range(n)]
dx = [0,0,-1,1]
dy = [1,-1,0,0]
q = deque()
q.append((start['x'], start['y'], 0))
while q:
cx, cy, count = q.popleft()
if cx == end['x'] and cy == end['y']:
return count
for i in range(4):
nx = cx + dx[i]
ny = cy + dy[i]
if is_range(nx, ny) and visited[nx][ny] == 0 and graph[nx][ny] != 'X':
q.append((nx, ny, count+1))
visited[nx][ny] = 1
return -1
graph = list(map(list, maps))
n = len(graph)
m = len(graph[0])
S = {'x' : 0, 'y' : 0}
L = {'x' : 0, 'y' : 0}
E = {'x' : 0, 'y' : 0}
for x in range(n):
for y in range(m):
if graph[x][y] == 'S':
S['x'] = x
S['y'] = y
elif graph[x][y] == 'L':
L['x'] = x
L['y'] = y
elif graph[x][y] == 'E':
E['x'] = x
E['y'] = y
c1 = find(S, L)
c2 = find(L, E)
if c1 == -1 or c2 == -1:
return -1
return c1 + c2
먼저 solution
내부에 있는 find
함수에 대하여 이야기하겠습니다.
find
함수는 bfs
를 구현한 함수이고 아래와 같이 동작합니다.
find
함수는 먼저 입력으로 들어오는 시작위치 start
의 좌표 x
, y
로 시작하여 현재위치 cx
, cy
가 종료위치 end
의 x
, y
와 같아지면 종료하게됩니다.
기본적인 bfs
의 구조를 가지며 좌표를 탐색할 때마다 count+1
을 하여 시간
을 증가시킵니다.
모든 q
를 반복했음에도 end
좌표에 도달하지 못한다면 탈출할 수 없다는 의미이기 때문에 -1
을 반환합니다.
다음은 find
함수의 밖으로 나와서 확인해보겠습니다.
문제를 해결하는데 사용한 변수는 아래와 같습니다.
graph
: 입력으로 들어오는maps
를 모두list
형태로 바꾸었습니다.n
: x축의 최대 범위입니다.m
: y축의 최대 범위입니다.S
:graph
에서 'S'(시작지점)에 해당하는 좌표입니다.L
:graph
에서 'L'(레버)에 해당하는 좌표입니다.E
:graph
에서 'E'(출구)에 대항하는 좌표입니다.
solution
의 과정은 아래와 같습니다.
먼저 graph
를 탐색하면서 시작지점(S
), 레버(L
), 출구(E
)의 위치를 저장합니다.
find
함수를 사용하여 시작지점(S
)으로부터 레버(L
)까지의 시간(c1
)을 찾습니다.
마찬가지로 레버(L
)로부터 출구(E
)까지의 시간(c2
)를 찾습니다.
위에서 구한c1
혹은 c2
에서 -1
이 나온다면 -1
을 반환합니다.
만약 -1
로 반환되지 않았다면 c1+c2
로 탈출에 필요한 최소 시간을 반환합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 가장 먼 노드 파이썬(Python) (0) | 2023.02.23 |
---|---|
[코딩테스트] 프로그래머스 주차 요금 계산 파이썬(Python) (0) | 2023.02.23 |
[코딩테스트] 프로그래머스 카드 뭉치 파이썬(Python) (0) | 2023.02.20 |
[코딩테스트] 백준 결혼식 파이썬(Python) (0) | 2023.02.18 |
[코딩테스트] 백준 유레카 이론 파이썬(python) (0) | 2023.02.17 |