💌풀이
조건 중에
- 출구는 레버가 당겨지지 않아도 지나갈 수 있으며, 모든 통로, 출구, 레버, 시작점은 여러 번 지나갈 수 있습니다
를 잘 생각해야 했던 문제이다.
flag 변수를 가지고 bfs를 두 번 돌렸다.
처음 bfs는 레버를 찾고,
다음으로 돌리는 bfs는 출구를 찾는다.
레버를 찾게 되면 flag값을 1로 변경한다.
그래서 flag 0일 때는 레버를 찾고 있는 중으로, S, E, O를 방문할 수 있게 했다. 레버를 발견하면 좌표값을 반환하고 answer에 레버까지 도달한 최단거리를 저장한다.
flag가 1일 때는 레버위치에서부터 출구를 찾는 중으로 S, L, O를 방문할 수 있게 했다. 출구를 발견하면 answer에 최단거리를 합산해서 저장한뒤 반환한다.
만약 레버를 찾았는데 출구는 못 찾은 경우가 있을 수 있다. 그래서 레버까지 도달한 answer 값과 출구를 찾는 bfs를 돌린 후의 answer값이 그대로라면 출구를 못찾았다는 것이므로 -1을 반환해야 한다.
좀 더럽게 짠 것 같아 아쉽다.
실제 코테에 나왔으면 엣지케이스때문에 실패했을 문제다. 조건을 잘 생각하고 항상 엣지케이스 생각도 잘 해야 할 것 같다.
💌파이썬 코드
from collections import deque
flag=0
answer=0
def solution(maps):
dx=[-1,1,0,0]
dy=[0,0,-1,1]
def bfs(x,y):
global flag,answer
visited=[[0]*len(maps[0]) for _ in range(len(maps))]
visited[x][y]=1
q=deque()
q.append((x,y))
while q:
cx,cy=q.popleft()
for i in range(4):
nx,ny=cx+dx[i],cy+dy[i]
if nx<0 or nx>=len(maps) or ny<0 or ny>=len(maps[0]):
continue
if (maps[nx][ny]=='O' or maps[nx][ny]=='S') and visited[nx][ny]==0:
visited[nx][ny]=visited[cx][cy]+1
q.append((nx,ny))
elif maps[nx][ny]=='L' and flag==0:
visited[nx][ny]=visited[cx][cy]+1
labor=[nx,ny]
flag=1
answer=visited[nx][ny]-1
return labor
elif maps[nx][ny]=='E' and flag==1:
visited[nx][ny]=visited[cx][cy]+1
end=[nx,ny]
answer+=visited[nx][ny]-1
return end
elif maps[nx][ny]=='L' and visited[nx][ny]==0 and flag==1:
visited[nx][ny]=visited[cx][cy]+1
q.append((nx,ny))
elif maps[nx][ny]=='E' and visited[nx][ny]==0 and flag==0:
visited[nx][ny]=visited[cx][cy]+1
q.append((nx,ny))
for i in range(len(maps)):
for j in range(len(maps[0])):
if maps[i][j]=='S':
x=bfs(i,j)
break
if answer==0 and flag==0:
return -1
firstAns=answer
x=bfs(x[0],x[1])
if firstAns==answer:
return -1
return answer
'알고리즘' 카테고리의 다른 글
[백준/파이썬(Python)] 넴모넴모 14712 Silver 1 (0) | 2023.02.20 |
---|---|
[백준/파이썬(Python)] 옥상정원꾸미기 Gold5 6198 (0) | 2023.02.18 |
[백준/자바(JAVA)] 구간 합 구하기5 11660 Silver 1 (0) | 2023.02.13 |
[백준/자바(JAVA)] 스위치 켜고 끄기 1244 Silver 4 (0) | 2023.02.11 |
[백준/파이썬(Python), 자바(JAVA)] 회의실 배정1931 Silver1 (0) | 2023.02.10 |
댓글