백준 16197 두 동전

gmlwlswldbs·2022년 2월 26일
0

코딩테스트

목록 보기
127/130
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

n, m = map(int, input().split())
board = [list(input()) for _ in range(n)]
ans = 11
flag = 0
for i in range(n):
    for j in range(m):
        if board[i][j] == 'o':
            if flag == 0:
                cx1, cy1 = i, j
                flag = 1
            else:
                cx2, cy2 = i, j
            board[i][j] = '.'

def press(cx1, cy1, cx2, cy2, cnt):
    global ans
    if cnt >= 10:
        return
    for dir in range(4):
        ncx1, ncy1 = cx1 + dx[dir], cy1 + dy[dir]
        ncx2, ncy2 = cx2 + dx[dir], cy2 + dy[dir]
        # 두 개 같이 떨어지면
        if (ncx1 < 0 or ncx1 >= n or ncy1 < 0 or ncy1 >= m) and (ncx2 < 0 or ncx2 >= n or ncy2 < 0 or ncy2 >= m):
            continue
        # 하나만 떨어지면
        elif (ncx1 < 0 or ncx1 >= n or ncy1 < 0 or ncy1 >= m) or (ncx2 < 0 or ncx2 >= n or ncy2 < 0 or ncy2 >= m):
            ans = min(ans, cnt+1)
            return
        # 둘 다 안 떨어지면
        else:
        	# 이동하려는 칸이 벽이면 그대로 있음
            if board[ncx1][ncy1] == '#':
                ncx1, ncy1 = cx1, cy1
            if board[ncx2][ncy2] == '#':
                ncx2, ncy2 = cx2, cy2
            press(ncx1, ncy1, ncx2, ncy2, cnt + 1)

press(cx1, cy1, cx2, cy2, 0)
if ans == 11:
    print(-1)
else:
    print(ans)

0개의 댓글