728x90
https://www.acmicpc.net/problem/12100
12100번: 2048 (Easy)
첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2
www.acmicpc.net
해당 문제는 5번의 이동으로 테이블에 있는 값중 최대값을 찾아서 리턴해야하는 문제이다.
순열 조합으로 해당 문제를 해결해야한다. R->R->R->L->R 의 결과와 R->L->R->R->R 의 결과가 다르기 때문이다.
순열의 조건으로 탐색을 시작하고 5번의 탐색의 깊이를 백트래킹 조건으로 놓는다. 즉 모든 경우의 수를 탐색하여 최대값을 리턴 하면 된다.
움직이는 조건은 Up,Down,Right,Left로 움직일 수 있다 따라서 상,하,좌,우 로 움직이는 함수를 정의한다.
import copy
N = int(input())
table = []
for _ in range(N):
table.append(list(map(int, input().split())))
def up(table):
for j in range(N):
pointer = 0
for i in range(1, N):
if table[i][j]:
temp = table[i][j]
table[i][j] = 0
if table[pointer][j]:
if table[pointer][j] == temp: # 포인터와 같다면
table[pointer][j] = temp*2
pointer += 1
else:
pointer += 1
table[pointer][j] = temp
else:
table[pointer][j] = temp
return table
def down(table):
for j in range(N):
pointer = N-1
for i in range(N-2, -1, -1):
if table[i][j]:
temp = table[i][j]
table[i][j] = 0
if table[pointer][j]:
if table[pointer][j] == temp: # 포인터와 같다면
table[pointer][j] = temp*2
pointer -= 1
else:
pointer -= 1
table[pointer][j] = temp
else:
table[pointer][j] = temp
return table
def left(table):
for i in range(N):
pointer = 0
for j in range(1, N):
if table[i][j]:
temp = table[i][j]
table[i][j] = 0
if table[i][pointer]:
if table[i][pointer] == temp: # 포인터와 같다면
table[i][pointer] = temp*2
pointer += 1
else:
pointer += 1
table[i][pointer] = temp
else:
table[i][pointer] = temp
return table
def right(table):
for i in range(N):
pointer = N-1
for j in range(N-2, -1, -1):
if table[i][j]:
temp = table[i][j]
table[i][j] = 0
if table[i][pointer]:
if table[i][pointer] == temp: # 포인터와 같다면
table[i][pointer] = temp*2
pointer -= 1
else:
pointer -= 1
table[i][pointer] = temp
else:
table[i][pointer] = temp
return table
def move(pos, table):
if pos == 0:
return up(table)
elif pos == 1:
return down(table)
elif pos == 2:
return left(table)
else :
return right(table)
def dfs(table, depth):
if depth == 5:
return max(map(max, table))
maxvalue = 0
for i in range(4):
maxvalue = max(maxvalue, dfs(move(i, copy.deepcopy(table)), depth+1))
return maxvalue
print(dfs(table, 0))
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1107번 : 리모컨 (0) | 2023.07.23 |
---|---|
[백준] 1707번 : 이분 그래프 (0) | 2023.07.23 |
[백준] 15649번 : N과 M(1) (0) | 2023.07.18 |
[백준] 9663번 : N-Queen (0) | 2023.07.18 |
[백준] 2805번 : 나무자르기 (0) | 2023.07.17 |