Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 329번
- dataframe
- 리트코드
- 센서
- 2212
- LongestIncreasingPathinaMatrix
- 홀수홀릭호석
- iOS앱개발
- IOS개발기
- leetcode329
- 릿코드
- 사다리조작
- 2212번
- 329
- leetcode
- 백죽
- 백준
- 프로그래머스
- 크게만들기
- 백준알고리즘
- IOS입문
- 2812번
- IOS도전기
- 백준문제
- iOS개발
- stack문제
- 15684
- IOS도전
- 20164번
- BOJ
Archives
- Today
- Total
알고리즘 풀어주는 블로그
BOJ 12100번 : 2048 (easy) - Python 본문
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를 미는 게 안 되는걸 찾다보니까 맵 초기화를 매 방향마다 해주는걸 놓쳐서 고생했습니다 ㅠㅠ
.
'알고리즘 문제 > 백준(BOJ)' 카테고리의 다른 글
BOJ 2812번 : 크게 만들기 - python (0) | 2021.05.17 |
---|---|
BOJ 20164번 : 홀수 홀릭 호석 - python (0) | 2021.05.17 |
BOJ 2212번 : 센서 - python (0) | 2021.05.04 |
BOJ 15684번 : 사다리 조작 - C++ (0) | 2021.04.18 |