https://school.programmers.co.kr/learn/courses/30/lessons/169199
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제요약:
벽에 부딫혀야 이동이 끝나는 리코쳇 로봇이 있다. 이 로봇이 지정된 지점에 갈수있다면 몇번만에 갈수있는지, 못간다면 -1 을 반환하라.
소요시간:
25분
난이도2
코딩:
from collections import deque
def solution(board):
dy = [-1,0,1,0]
dx = [0,1,0,-1]
m ,n = len(board[0]),len(board)
def bfs():
temp = [[0]*m for _ in range(n)]
q = deque([])
piv= 0
#y,x는 R 즉 로봇 위치
for y in range(n):
for x in range(m):
if board[y][x] == 'R':
piv =1
break
if piv:
break
#temp에는 지나간적이 있다면 1 없다면 0
temp[y][x] = 1
q.append((1,y,x))
while q:
t,y,x = q.popleft()
for i in range(4):
ny,nx = y,x
#갈 수있는 만큼 끝까지 가기
while True:
ny +=dy[i]
nx +=dx[i]
if ny<0 or ny>=n or nx<0 or nx>=m or board[ny][nx] =='D':
ny -=dy[i]
nx -=dx[i]
break
#온적이 있다면 아웃
if temp[ny][nx]!=0:
continue
#온적이 없다면
else:
#정답이라면
if board[ny][nx] == 'G':
return t
else:
#온적이 있습니다.
temp[ny][nx] = t
q.append((t+1,ny,nx))
else:
return -1
return bfs()
제일 무난한 bfs()문제였지 않았나 싶다 로봇 위치 파악한 후, 갈수있을만큼 이동후 한칸전으로 돌려주고 왔던곳인지 여부 체크 후 정답이라면 반환 아니라면 q에 저장후 반복, 이런 간단한 문제일 수록 실수 하지않고, 꼼꼼히 빨리 푸는 연습이 되어야 한다고 생각한다.