2048(easy)
https://www.acmicpc.net/problem/12100
12100번: 2048 (Easy)
첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2
www.acmicpc.net
문제요약:
2048 게임은 보드의 크기가 N×N 이다. 보드의 크기와 보드판의 블록 상태가 주어졌을 때, 최대 5번 이동해서 만들 수 있는 가장 큰 블록의 값을 구하는 프로그램을 작성하시오.
난이도:
골드 2
소요시간:
30분+40분
제출횟수:
2회
코딩:
import sys
input = sys.stdin.readline
n = int(input())
arr =[list(map(int,input().split())) for _ in range(n)]
ans = 0
def move(arr):
arr = [i[:] for i in arr]
#왼쪽으로 붙이기
for y in range(n):
temp = []
for x in range(n):
if arr[y][x]:
temp.append(arr[y][x])
arr[y] = temp+[0]*(n-len(temp))
#합치기
for y in range(n):
for x in range(n-1):
if arr[y][x] == arr[y][x+1]:
#하나 오른쪽이랑 같다면
arr[y][x] = 2*arr[y][x]
arr[y] = arr[y][:x+1]+arr[y][x+2:]+[0]
continue
return arr
def dfs(temp1,k):
global ans
if k==5:
ans = max(ans,max([i for row in temp1 for i in row]))
return
for i in range(4):
#회전시키기
temp1= [list(row)[::-1] for row in zip(*temp1)]
temp2= move(temp1)
dfs(temp2,k+1)
dfs(arr,0)
print(ans)
문제 조건에 맞게 구현을 성실히 해주면 되는 문제입니다. 이때 회전을 사용하지 않으면 부르트포스 (aka. 노가다) 로 보일 수 있지만 특히 이런 2차원 배열에서는 한 쪽 방향으로의 구현을 만들어 놓고 회전을 시키면서 시간을 많이 절약할 수 있습니다. arr= [list(row)[::-1] for row in zip(*arr)] 과 같은 코드로 2차원 배열을 회전 시킬 수 있으며(이유는 함수를 하나하나씩 뜯어보시면 이해가 되실겁니다. zip함수의 반환형태가 tuple이기 때문에 접근을 위해 list로 묶어주었습니다.
그 후 계산을 진행한뒤 진행되면 한칸씩 땡기고 뒤에 [0]을 붙혀주는 식으로 진행했으며 코드는 약 30분 정도 에 걸쳐 짰는데, 틀렸고 약 40분을 해매대가 오류를 발견했습니다. 다름이 아니고 move()함수를 하고 나면 temp1함수가 변하는것 입니다. (move함수의 첫줄이 없었음) 매번 자주 실수 하는 만큼 다음엔 정말 신경 써서 코딩을 해할것 같습니다.(슬라이싱으로 t복사를 해서 move 이후에도 temp1은 변하지 않음)