https://www.acmicpc.net/problem/16197
16197번: 두 동전
N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고,
www.acmicpc.net
n, m = map(int, input().split())
a = [list(input()) for _ in range(n)]
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
location = []
for i in range(n):
for j in range(m):
if a[i][j] == 'o':
location.append((i, j))
x1, y1 = location[0]
x2, y2 = location[1]
def go(x1, y1, x2, y2, count):
is_fall = [False, False] # 동전이 떨어졌는지 여부 파악
# 버튼을 10번 넘게 누른 경우
if count == 11:
return -1
if (x1 < 0 or x1 >= n or y1 < 0 or y1 >= m):
is_fall[0] = True
if (x2 < 0 or x2 >= n or y2 < 0 or y2 >= m):
is_fall[1] = True
if is_fall[0] and is_fall[1]: # 둘 다 떨어진 경우 (불가능)
return -1
if is_fall[0] or is_fall[1]: # 하나만 떨어진 경우 (정답)
return count
ans = -1
for i in range(4):
nx1, ny1 = x1 + dx[i], y1 + dy[i]
nx2, ny2 = x2 + dx[i], y2 + dy[i]
# 이동할 칸이 벽이라면 이동하지 않는걸로
if 0 <= nx1 < n and 0 <= ny1 < m and a[nx1][ny1] == '#':
nx1, ny1 = x1, y1
if 0 <= nx2 < n and 0 <= ny2 < m and a[nx2][ny2] == '#':
nx2, ny2 = x2, y2
# 다음 칸으로 진행시켰는데
temp = go(nx1, ny1, nx2, ny2, count + 1)
if temp == -1: # -1 받았다면 무시
continue
if ans == -1 or ans > temp: # -1이 아니라면(정답이라면)
ans = temp
return ans
print(go(x1, y1, x2, y2, 0))
네 개의 버튼 (상하좌우)를 통해 두 동전을 동시에 이동시키는데
1. 동전이 벽에 가로 막히면 제자리
2. 동전 하나가 떨어지면 정답
3. 동전 2개가 동시에 떨어지는건 불가능
4. 버튼을 10번이상 사용하면 무효
라는 4가지 조건을 지키며 재귀함수를 통해서 풀어주었다
'백준 알고리즘 (Baekjoon Algorithm)' 카테고리의 다른 글
[파이썬] 백준 알고리즘 No.9663 N-Queen (0) | 2022.01.24 |
---|---|
[파이썬] 백준 알고리즘 No.16198 에너지 모으기 (0) | 2022.01.23 |
[파이썬 (풀이추가예정)] 백준 알고리즘 No.11054 가장 긴 바이토닉 부분 수열 (0) | 2022.01.17 |
[파이썬] 백준 알고리즘 No.1309 동물원 (0) | 2022.01.15 |
[파이썬] 백준 알고리즘 No.1149 RGB 거리 (0) | 2022.01.14 |