2048게임을 했을 때 5번만에 나오는 제일 큰 숫자를 찾는 문제다.
고려했던 사항은 다음과 같다.
구현문제지만 조건도 많고 까다로운 문제였다. 특히, 중복되는 코드가 많아서 불편하지만 합치는 시간보다 그냥 구현하는게 효율적인것 같다.
import sys
def move(board, dir, count):
global answer
if count > 5:
return
if dir == 'left':
for l in range(n):
k = 0
i = 0
while i < n:
if board[l][i] > 0:
current = board[l][i]
j = i + 1
while j < n:
if current == board[l][j]:
board[l][i] = 0
board[l][j] = 0
i = j
board[l][k] = current * 2
break
elif board[l][j] != 0:
break
j += 1
if i != j:
board[l][i] = 0
board[l][k] = current
k += 1
i += 1
elif dir == 'right':
for l in range(n):
k = n - 1
i = n - 1
while i >= 0:
if board[l][i] > 0:
current = board[l][i]
j = i - 1
while j >= 0:
if current == board[l][j]:
board[l][i] = 0
board[l][j] = 0
i = j
board[l][k] = current * 2
break
elif board[l][j] != 0:
break
j -= 1
if i != j:
board[l][i] = 0
board[l][k] = current
k -= 1
i -= 1
elif dir == 'up':
for l in range(n):
k = 0
i = 0
while i < n:
if board[i][l] > 0:
current = board[i][l]
j = i + 1
while j < n:
if current == board[j][l]:
board[i][l] = 0
board[j][l] = 0
i = j
board[k][l] = current * 2
break
elif board[j][l] != 0:
break
j += 1
if i != j:
board[i][l] = 0
board[k][l] = current
k += 1
i += 1
else:
for l in range(n):
k = n - 1
i = n - 1
while i >= 0:
if board[i][l] > 0:
current = board[i][l]
j = i - 1
while j >= 0:
if current == board[j][l]:
board[i][l] = 0
board[j][l] = 0
i = j
board[k][l] = current * 2
break
elif board[j][l] != 0:
break
j -= 1
if i != j:
board[i][l] = 0
board[k][l] = current
k -= 1
i -= 1
answer = max(answer, max(map(max, board)))
for _dir in dirs:
move([b[:] for b in board], _dir, count + 1)
n = int(sys.stdin.readline().strip())
board = [[] for _ in range(n)]
for i in range(n):
line = map(int, sys.stdin.readline().strip().split(' '))
for l in line:
board[i].append(l)
dirs = ['left', 'right', 'up', 'down']
answer = 0
for dir in dirs:
move([b[:] for b in board], dir, 1)
print(answer)