14503번 로봇 청소기
문제 출처 : https://www.acmicpc.net/problem/14503
빈 공간을 탐색한다... DFS? ( bfs는 최단경로, 특수경로에 대해서 효과적! )
개념적으로는 BFS로 풀이 가능하겠다만 뭔가 복잡해지니까 그냥 막연하게 풀어버렸다. 예전에 방향과 같은 direction을 배열의 index를 이용해 참조하는 유사한 문제들을 접해봐서 이를 바탕으로 활용해서 풀 수 있었던 듯...
각 조건들에 대해 그냥 하나씩 조건문으로 차근차근 분할해서 적용시켰다. 네 방향에 대한 판단이 우선적으로 이루어지면 청소기 돌아가는 시간이 줄어들 것 같아 c,d를 먼저 작동하고 후에 빈 공간을 탐색했다.
import sys
N,M = list(map(int,sys.stdin.readline().rstrip("\n").split()))
r,c,d = list(map(int,sys.stdin.readline().rstrip("\n").split()))
board = [list(map(int,sys.stdin.readline().rstrip("\n").split())) for _ in range(N)]
pos = [r,c]
dic = [[-1,0],[0,1],[1,0],[0,-1]] # y,x
now = d # index로 표현, 좌측 이동 = (d+3)%4
count = 0
board[pos[0]][pos[1]]=2
count+=1
def bfs() :
while True : # 2.
#c, d
if (board[pos[0]+dic[0][0]][pos[1]+dic[0][1]]!=0) and (board[pos[0]+dic[1][0]][pos[1]+dic[1][1]]!=0) and (board[pos[0]+dic[2][0]][pos[1]+dic[2][1]]!=0) and (board[pos[0]+dic[3][0]][pos[1]+dic[3][1]]!=0) :
if board[pos[0]+dic[(now+2)%4][0]][pos[1]+dic[(now+2)%4][1]] == 1 :
break
pos[0]+=dic[(now+2)%4][0]
pos[1]+=dic[(now+2)%4][1]
continue
# a, 1.
if board[pos[0]+dic[(now+3)%4][0]][pos[1]+dic[(now+3)%4][1]]==0 :
now = (now+3)%4
pos[0]= pos[0]+dic[now][0]
pos[1]= pos[1]+dic[now][1]
board[pos[0]][pos[1]]=2
count+=1
continue
#b
if board[pos[0]+dic[(now+3)%4][0]][pos[1]+dic[(now+3)%4][1]]!=0 :
now = (now+3)%4
continue
print(count)
만약 BFS로 풀이한다면?
사실 이미 BFS구조로 풀은 것
#a 부분은 next를 참조하고 #b부분은 visited의 역할을 하며 #c,d는 부연적인 조건 역할을 한다.
사실 교수님께서 예전에 while 1: 과 같은 방식은 사실 무한루프를 전제로 하기 때문에 좋은 방식이 아니다 라는 말씀을 해주셔서 지양할려 했지만 빡쳐서 그냥 해버렸다ㅎ
1시간이면 다 풀것을 방향값 잘못 설정해놔가지고 이유도 못찾고 몇시간이나 헤맸네 에휴.. 바보
Author And Source
이 문제에 관하여(14503번 로봇 청소기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wondang120/14503번-로봇-청소기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)