일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 보석 쇼핑
- SW Expert Academy
- 미세먼지 안녕!
- 파이썬
- 키패드 누르기
- 14499번
- 16234번
- 9095번
- 수식 최대화
- 베스트엘범
- SW ExpertAcademy
- 19238번
- 12869번
- 빛의 경로 사이클
- 15686번
- 어른 상어
- 프로그래머스
- python
- 감소하는 수
- 2020 카카오 인턴십
- 거울 설치
- 백준 알고리즘
- 12865번
- QueryDSL 기초
- 경주로 건설
- 1789번
- 스타트 택시
- HTML 기초
- 17144번
- 1038번
Archives
- Today
- Total
보물창고 블로그
백준 알고리즘 12100번 2048 풀이 with Python 본문
728x90
문제 링크: https://www.acmicpc.net/problem/12100
12100번: 2048 (Easy)
첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2보다 크거나 같고, 1024보다 작거나 같은 2의 제곱꼴이다. 블록은 적어도 하나 주어진다.
www.acmicpc.net
2048에서 구현해야 될 가장 중요한 요소는 판을 상하좌우로 움직였을 때 제대로 구현하는 것이 가장 중요하고, 이후에는 5번 움직이는 것을 구현하는 것이 중요하였다. 나는 sub라는 함수로 상하좌우를 움직였을 때 판의 최댓값과 판의 배열 상태를 return 하도록 하였고, solution 함수를 이용하여 상하좌우로 5번 움직여서 최댓값을 리턴하도록 하는 함수를 구현하였다. 다음은 이를 구현한 코드이다.
from copy import deepcopy
def sub(map111, d, n):
make = []
maxi = 0
map2 = deepcopy(map111)
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
if d == 0 or d == 1:
a = range(n)
b = range(n)
else:
a = range(n - 1, -1, -1)
b = range(n - 1, -1, -1)
for i in a:
for j in b:
if map2[i][j] == 0:
continue
else:
if maxi < map2[i][j]:
maxi = map2[i][j]
nx = i
ny = j
while 1:
nx += dx[d]
ny += dy[d]
# 탐색한 점이 보드판 위의 점일 때
if -1 < nx < n and -1 < ny < n:
# 합칠 수 있을 때
if map2[nx][ny] == map2[i][j] and [nx, ny] not in make:
map2[nx][ny] *= 2
map2[i][j] = 0
if maxi < map2[nx][ny]:
maxi = map2[nx][ny]
make.append([nx, ny])
break
# 값은 같으나 합칠 수 없을 때 또는 값이 다르고 0이 아닐 때
elif map2[nx][ny] == map2[i][j] or (map2[nx][ny] != map2[i][j] and map2[nx][ny] != 0):
map2[nx - dx[d]][ny - dy[d]] = map2[i][j]
if nx - dx[d] == i and ny - dy[d] == j:
break
else:
map2[i][j] = 0
break
# 탐색값이 0일 때는 계속 전진
elif map2[nx][ny] == 0:
continue
# 맵의 범위를 넘어갈 때
else:
nx -= dx[d]
ny -= dy[d]
if nx == i and ny == j:
break
else:
map2[nx][ny] = map2[i][j]
map2[i][j] = 0
break
return map2, maxi
def solution(map11, n):
global answer
stack = []
stack.append([[map11, 0], 0])
while stack:
result, count = stack.pop()
if count == 5:
if result[1] > answer:
answer = result[1]
else:
for w in range(4):
stack.append([sub(result[0], w, n), count + 1])
n = int(input())
map1 = [list(map(int, input().split())) for _ in range(n)]
answer = 0
solution(map1, n)
print(answer)
'알고리즘 풀이 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 3055번 탈출 풀이 with Python (0) | 2020.02.23 |
---|---|
백준 알고리즘 15685번 드래곤 커브 풀이 with Python (0) | 2020.02.21 |
백준 알고리즘 13458번 시험감독 풀이 with Python (0) | 2020.02.01 |
백준 알고리즘 13460번 구슬탈출 풀이 with Python (0) | 2020.01.16 |
백준 알고리즘 14502번 연구소 풀이 with Python (0) | 2020.01.09 |
Comments