알고리즘 문제/백준(BOJ)
BOJ 12100번 : 2048 (easy) - Python
요네리
2021. 4. 18. 00:08
Q. 문제
https://www.acmicpc.net/problem/12100
12100번: 2048 (Easy)
첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2
www.acmicpc.net
A. 풀이
[python]
from collections import deque
N = int(input())
mp = [[*map(int, input().split())] for _ in range(N)]
def bfs():
dq = deque()
dq.append(mp)
ans = 0
for c in range(6):
for qs in range(len(dq)):
v = dq.popleft()
for i in range(N):
for j in range(N):
ans = max(ans, v[i][j])
# up
vv = [[0] * N for _ in range(N)]
for j in range(N):
q = deque()
for i in range(N):
if v[i][j] != 0:
if len(q) > 0 and q[len(q) - 1] == v[i][j]:
q.pop()
q.append(v[i][j] * -2)
else:
q.append(v[i][j])
for i in range(N):
if len(q) > 0:
vv[i][j] = abs(q.popleft())
else:
vv[i][j] = 0
dq.append(vv)
# down
vv = [[0] * N for _ in range(N)]
for j in range(N):
q = deque()
for i in range(N - 1, -1, -1):
if v[i][j] != 0:
if len(q) > 0 and q[len(q) - 1] == v[i][j]:
q.pop()
q.append(v[i][j] * -2)
else:
q.append(v[i][j])
for i in range(N - 1, -1, -1):
if len(q) > 0:
vv[i][j] = abs(q.popleft())
else:
vv[i][j] = 0
dq.append(vv)
# right
vv = [[0] * N for _ in range(N)]
for i in range(N):
q = deque()
for j in range(N-1, -1, -1):
if v[i][j] != 0:
if len(q) > 0 and q[len(q) - 1] == v[i][j]:
q.pop()
q.append(v[i][j] * -2)
else:
q.append(v[i][j])
for j in range(N-1, -1, -1):
if len(q) > 0:
vv[i][j] = abs(q.popleft())
else:
vv[i][j] = 0
dq.append(vv)
# left
vv = [[0] * N for _ in range(N)]
for i in range(N):
q = deque()
for j in range(N):
if v[i][j] != 0:
if len(q) > 0 and q[len(q) - 1] == v[i][j]:
q.pop()
q.append(v[i][j] * -2)
else:
q.append(v[i][j])
for j in range(N):
if len(q) > 0:
vv[i][j] = abs(q.popleft())
else:
vv[i][j] = 0
dq.append(vv)
return ans
print(bfs())
dfs/bfs + 시뮬레이션
1. 위, 아래, 왼쪽, 오른쪽 - 4방향으로 맵 밀기
2. 5번 안에 최고 숫자
3. 한 타임에, 한 번 합쳐진 수는 또 합쳐질 수 없음
저는 큐를 만들어서 이동할 수 있는 모든 경우를 큐에 저장했습니다.
그래서 큐에서 맵을 하나씩 꺼내서 4방향으로 이동한 결과를 다시 큐로 push 했습니다. (python 은 append)
for 문의 start index와 end index에 따라 맵을 미는 방향이 바뀌는데,
자꾸 left를 미는 게 안 되는걸 찾다보니까 맵 초기화를 매 방향마다 해주는걸 놓쳐서 고생했습니다 ㅠㅠ
.