14503번 로봇 청소기

18942 단어 구현탐색bojboj

문제 출처 : 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시간이면 다 풀것을 방향값 잘못 설정해놔가지고 이유도 못찾고 몇시간이나 헤맸네 에휴.. 바보

좋은 웹페이지 즐겨찾기