반응형
programmers.co.kr/learn/courses/30/lessons/67256
풀이
저는 일단 bfs 방식 유사하게 풀었는데
find 함수 내에서 x,y 값을 바탕으로
check 리스트로 거리를 계산했습니다.
코드가 좀 길다보니 시간 좀 오래걸렸습니다...
from collections import deque
graph=[[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
dx=[0,0,1,-1]
dy=[1,-1,0,0]
def find(x,y,number):
dis=0
queue=deque()
queue.append((x,y))
check=[[-1]*3 for i in range(4)]
target_x=5
check[x][y]+=1
while queue:
x,y=queue.popleft()
for i in range(4):
nx=x+dx[i]
ny=y+dy[i]
if 0<=nx<=3 and 0<=ny<=2:
if graph[nx][ny]==number and check[nx][ny]==-1:
check[nx][ny]=check[x][y]+1
target_x=nx
target_y=ny
break
elif check[nx][ny]==-1:
check[nx][ny]=check[x][y]+1
queue.append((nx,ny))
if target_x!=5:
dis=check[target_x][target_y]
break
return dis
def solution(numbers, hand):
answer = ''
left_x,left_y=3,0
right_x,right_y=3,2
for i in numbers:
if i==1 :
left_x=0
left_y=0
answer=answer+'L'
elif i==4:
left_x=1
left_y=0
answer=answer+'L'
elif i==7:
left_x=2
left_y=0
answer=answer+'L'
elif i==3:
right_x=0
right_y=2
answer=answer+'R'
elif i==6:
right_x=1
right_y=2
answer=answer+'R'
elif i==9:
right_x=2
right_y=2
answer=answer+'R'
else:
l_dis=find(left_x,left_y,i)
r_dis=find(right_x,right_y,i)
if l_dis>r_dis:
ret_hand='R'
elif l_dis<r_dis:
ret_hand='L'
elif l_dis==r_dis:
if hand=='left':
ret_hand='L'
else:
ret_hand='R'
if i==2:
target_x=0
target_y=1
elif i==5:
target_x=1
target_y=1
elif i==8:
target_x=2
target_y=1
elif i==0:
target_x=3
target_y=1
if ret_hand=='L':
left_x=target_x
left_y=target_y
answer=answer+'L'
else:
right_x=target_x
right_y=target_y
answer=answer+'R'
return answer
다른 사람 풀이 보니까
1. abs 써서 거리 계산 하신 분 있구
2. 미리 거리 값을 저장해놓으신 분도 있드라구요
반응형
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[Python/파이썬 프로그래머스] 메뉴 리뉴얼 (0) | 2021.05.10 |
---|---|
[Python/파이썬 프로그래머스] 보석 쇼핑 (0) | 2021.05.06 |
[Python/파이썬 프로그래머스] 호텔 방 배정 (0) | 2021.05.04 |
[Python/파이썬 프로그래머스] 완주하지 못한 선수 (0) | 2021.05.01 |
[Python/파이썬 프로그래머스] 불량 사용자 (0) | 2021.04.29 |