상세 컨텐츠

본문 제목

리코쳇 로봇

코딩테스트/DFS,BFS

by 수타. 2023. 6. 23. 16:15

본문

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에 저장후 반복, 이런 간단한 문제일 수록 실수 하지않고, 꼼꼼히 빨리 푸는 연습이 되어야 한다고 생각한다.

'코딩테스트 > DFS,BFS' 카테고리의 다른 글

불량 사용자  (0) 2023.07.07
아이템 줍기  (0) 2023.06.29
무인도 여행  (0) 2023.06.20
감시피하기  (0) 2023.06.15
연산자 끼워넣기  (0) 2023.06.12

관련글 더보기