PS
[λ°±μ€] 12100 2048(easy) with Python
νμ€_It's
2021. 10. 25. 23:34
728x90
λ°μν
π BOJ 12100 2048(easy)
π‘ 쑰건
보λμ ν¬κΈ°λ
N * N
(1 β€ N β€ 20)
0
μ λΉμΉΈ, μ΄μΈμ κ°μ λΈλ‘μ κ°λ€μ λνλΈλ€.
λΈλ‘μ μ°μ¬ μλ μλ2λ³΄λ€ ν¬κ±°λ κ°κ³ , 1024λ³΄λ€ μκ±°λ κ°μ 2μ μ κ³±κΌ΄
μ΄λ€.
λΈλ‘μ μ μ΄λ νλ μ£Όμ΄μ§λ€.κ°μ κ°μ κ°λ λ λΈλ‘μ΄ μΆ©λνλ©΄ λ λΈλ‘μ νλλ‘ ν©μ³μ§κ² λλ€.
ν λ²μ μ΄λμμ μ΄λ―Έ ν©μ³μ§ λΈλ‘μ λ λ€λ₯Έ λΈλ‘κ³Ό λ€μ ν©μ³μ§ μ μλ€.
μ΅λ λ€μ―λ² μ΄λ
μμΌμ μ»μ μ μλ κ°μ₯ ν° λΈλ‘μ κ°μ μΆλ ₯.λ°±νΈλνΉ μκ³ λ¦¬μ¦ μ νμ λ¬Έμ
π₯ μμ€ μ½λ
from sys import stdin, setrecursionlimit
from collections import deque
setrecursionlimit(int(1e9))
n = int(stdin.readline())
arr = [list(map(int, stdin.readline().split())) for _ in range(n)]
answer, q = 0, deque()
def get(i, j):
if arr[i][j]:
q.append(arr[i][j])
arr[i][j] = 0
def merge(i, j, di, dj):
while q:
x = q.popleft()
if not arr[i][j]:
arr[i][j] = x
elif arr[i][j] == x:
arr[i][j] = x * 2
i, j = i + di, j + dj
else:
i, j = i + di, j + dj
arr[i][j] = x
def move(k):
if k == 0:
for j in range(n):
for i in range(n):
get(i, j)
merge(0, j, 1, 0)
elif k == 1:
for j in range(n):
for i in range(n - 1, -1, -1):
get(i, j)
merge(n - 1, j, -1, 0)
elif k == 2:
for i in range(n):
for j in range(n):
get(i, j)
merge(i, 0, 0, 1)
else:
for i in range(n):
for j in range(n - 1, -1, -1):
get(i, j)
merge(i, n - 1, 0, -1)
def recursive(count):
global arr, answer
if count == 5:
for i in range(n):
answer = max(answer, max(arr[i]))
return
b = [x[:] for x in arr]
for k in range(4):
move(k)
recursive(count + 1)
arr = [x[:] for x in b]
recursive(0)
print(answer)
π μμ λ° μ€νκ²°κ³Ό
μμ
3
2 2 2
4 4 4
8 8 8
μ€νκ²°κ³Ό
16
β¨οΈ λ¬Έμ νμ΄
λ°±νΈλνΉμ μ¬κ·κ° κ°μ₯ ν΅μ¬.
λ°±νΈλνΉμ μννλ©° μ¬κ·λ₯Ό μ§ννrecursive
ν¨μμ νλΌλ―Έν°λ₯Όcnt
λ‘ μ£Όκ³ , 첫 μ€νμμλ0
μ μ£Όκ³ μ€νμν¨λ€.
- Nμ ν¬κΈ°κ° μκΈ° λλ¬Έμ
deep copy
λ₯Ό μ΄μ©ν λ°°μ΄λ³΅μ¬κ° κ°λ₯νλ€.
μ΄λ₯Ό ν΅ν΄ λ°©ν₯μ λ°κΎΈκΈ° μ , μ΄μ 보λμ μνλ₯Ό κΈ°μ΅νκΈ° μν μμ€μ½λλ₯Ό μμ±νλ€.
μμ§μ΄κΈ° μ 보λμ μν©μ κΈ°μ΅ν΄λμ§ μμΌλ©΄, λ°±νΈλνΉμ΄ μνλ μ μλ€.b = [x[:] for x in arr]
- λ€ λ°©ν₯μΌλ‘ λΈλ‘μ μμ§μΌ μ μμΌλ, λ°λ³΅λ¬Έμ ν΅ν΄ λ€ λ°©ν₯μΌλ‘ μμ§μ¬μ€λ€.
move()
ν¨μμμk
μ κ°μ λ°λΌ λ€ λ°©ν₯μΌλ‘ μμ§μ¬ μ€λ€.def move(k): # arr[i][j] if k == 0: # μλ‘ μ΄λ, λΈλ½λ€μ΄ μλ‘ λͺ¨λ μ΄λνλ©΄ row indexλ 0 for j in range(n): for i in range(n): get(i, j) merge(0, j, 1, 0) # row index 1μ© μ¦κ°νλ©΄μ μλμͺ½ λΈλ½λ€μ ν©μ³κ° elif k == 1: # μλλ‘ μ΄λ, λΈλ½λ€μ΄ μλλ‘ λͺ¨λ μ΄λνλ©΄ row indexλ n-1 for j in range(n): for i in range(n - 1, -1, -1): get(i, j) merge(n - 1, j, -1, 0) # row μΈλ±μ€ 1μ© κ°μνλ©΄μ μμͺ½λ€μ ν©μ³κ° elif k == 2: # μ€λ₯Έμͺ½μΌλ‘ μ΄λ, column indexλ 0 for i in range(n): for j in range(n): get(i, j) merge(i, 0, 0, 1) # column μΈλ±μ€ μ¦κ° μ€λ₯Έμͺ½μΌλ‘ μ΄λ else: # μΌμͺ½μΌλ‘ μ΄λ, column indexλ n-1 for i in range(n): for j in range(n - 1, -1, -1): get(i, j) merge(i, n - 1, 0, -1) # column μΈλ±μ€ κ°μ μΌμͺ½μΌλ‘ μ΄λ
get()
ν¨μμμ μμ§μΌ 보λλ€μ μνλ₯Ό νμΈνλ©΄μ μμ°¨μ μΌλ‘ μνν΄μ£Όκ³ ,
μννλ©΄μ λ°°μ΄ μμμ κ°μ΄0
μ΄ μλ κ²½μ°, μμμ κ°μν
μ λ£μ΄μ€λ€.
λ°°μ΄μ λ£μ κ°μ΄ μλ ν΄λΉ μ리λ0
μΌλ‘ λ°κΏμ€λ€.def get(i, j): if arr[i][j]: # 0μ΄ μλ κ°μ΄λΌλ©΄ q.append(arr[i][j]) # queueμ arrμ κ°μ λ£λλ€. arr[i][j] = 0 # μ²λ¦¬κ° λ λΉ μ리λ 0μΌλ‘ κ° μ λ°μ΄νΈ
merge()
ν¨μμμ κ° μ΄λνλ €λ λ°©ν₯μ μλ§κ² μΈλ±μ€λ₯Ό μ‘°μ νλ©° νκ° λΉλκΉμ§ λ°λ³΅νλ©° ν©μ³μ€λ€.
μμ§μ΄λ €λ κ°μ λΈλ‘μν
μμ κΊΌλ΄μ¨ ν, λμ κ³³μ λΈλμ κ°μ΄0
μ΄λΌλ©΄ κ·Έλ₯ λκ³ ,
κ°μ΄ μΌμΉνλ€λ©΄ 2μ μ κ³± κΌ΄μ΄κΈ°μ 2λ°°λ₯Ό ν΄μ€λ€.
κ°μ΄ μΌμΉ νμ§ μλλ€λ©΄ κ·Έ μ리μ κ·Έλλ‘ λλ€.
def merge(i, j, di, dj): # row index, column index, yλ°©ν₯, xλ°©ν₯
while q:
x = q.popleft() # μμ§μ΄λ €λ λΈλ‘ κ°μ κ°μ Έμ¨λ€. FIFO
if not arr[i][j]: # 0μ΄λΌλ©΄ κ·Έλλ‘ λλλ€.
arr[i][j] = x
elif arr[i][j] == x: # κ°μ΄ μΌμΉνλ€λ©΄
arr[i][j] = x * 2 # ν©μ³μ§λ―λ‘ 2λ°°λ‘ μ¦κ°
i, j = i + di, j + dj
else: # κ°μ΄ μΌμΉνμ§ μμΌλ©΄
i, j = i + di, j + dj
arr[i][j] = x
move()
ν¨μμ μ²λ¦¬κ° λλ¬λ€λ©΄,cnt + 1
μ νλΌλ―Έν°λ‘ μ£Όκ³ ,recursive
ν¨μλ₯Ό μ¬κ·νΈμΆ ν΄μ€λ€.
3λ²
λΆν° λ€μ λ°λ³΅νλ©΄μ,cnt κ°μ΄ 5, μ¦ λ€μ―λ² μμ§μμ λ
, 보λνμ μννλ€.
κ° λ°°μ΄μ μ΅λκ°κ³Ό μ λ΅μΌλ‘ μΆλ ₯νans
κ°μ λΉκ΅νμ¬ κ°±μ νλ€.
πΎ λλμ
- μ¬κ·ν¨μλ₯Ό μΌλ§λ μμ©μ ν μ μλμ§μ λν λ¬Έμ μλ€.
- get(), move() ν¨μλ₯Ό ꡬννλ κ²μ΄ κ°μ₯ μ΄λ €μ μΌλ©°, μ΄ λΆλΆμ λ€λ₯Έ λΈλ‘κ·Έμμ μμ΄λμ΄λ₯Ό μ»μ΄ ν΄κ²°νλ€.
- λͺ λ²μ΄κ³ λ€μ νμ΄λ³΄κΈ° μ’μ λ¬Έμ μΈ κ² κ°λ€. μ£Όλ§μ λ€μ ν λ² νμ΄λ³΄λ κ²μ΄ μ’κ² λ€.
λ°μν