[BOJ][๐ก2][๋ฐฑ์ค#12100] 2048 (Easy)
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold II
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
2048 ๊ฒ์์ 4ร4 ํฌ๊ธฐ์ ๋ณด๋์์ ํผ์ ์ฆ๊ธฐ๋ ์ฌ๋ฏธ์๋ ๊ฒ์์ด๋ค. ์ด ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด ๊ฒ์์ ํด๋ณผ ์ ์๋ค. ์ด ๊ฒ์์์ ํ ๋ฒ์ ์ด๋์ ๋ณด๋ ์์ ์๋ ์ ์ฒด ๋ธ๋ก์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ ์ค ํ๋๋ก ์ด๋์ํค๋ ๊ฒ์ด๋ค. ์ด๋, ๊ฐ์ ๊ฐ์ ๊ฐ๋ ๋ ๋ธ๋ก์ด ์ถฉ๋ํ๋ฉด ๋ ๋ธ๋ก์ ํ๋๋ก ํฉ์ณ์ง๊ฒ ๋๋ค. ํ ๋ฒ์ ์ด๋์์ ์ด๋ฏธ ํฉ์ณ์ง ๋ธ๋ก์ ๋ ๋ค๋ฅธ ๋ธ๋ก๊ณผ ๋ค์ ํฉ์ณ์ง ์ ์๋ค. (์ค์ ๊ฒ์์์๋ ์ด๋์ ํ ๋ฒ ํ ๋๋ง๋ค ๋ธ๋ก์ด ์ถ๊ฐ๋์ง๋ง, ์ด ๋ฌธ์ ์์ ๋ธ๋ก์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ๋ ์๋ค)
<๊ทธ๋ฆผ 1> <๊ทธ๋ฆผ 2> <๊ทธ๋ฆผ 3>
<๊ทธ๋ฆผ 1>์ ๊ฒฝ์ฐ์์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 2>์ ์ํ๊ฐ ๋๋ค. ์ฌ๊ธฐ์, ์ผ์ชฝ์ผ๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 3>์ ์ํ๊ฐ ๋๋ค.
<๊ทธ๋ฆผ 4> <๊ทธ๋ฆผ 5> <๊ทธ๋ฆผ 6> <๊ทธ๋ฆผ 7>
<๊ทธ๋ฆผ 4>์ ์ํ์์ ๋ธ๋ก์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 5>๊ฐ ๋๊ณ , ์ฌ๊ธฐ์ ๋ค์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 6>์ด ๋๋ค. ์ฌ๊ธฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ธ๋ก์ ์ด๋์์ผ <๊ทธ๋ฆผ 7>์ ๋ง๋ค ์ ์๋ค.
<๊ทธ๋ฆผ 8> <๊ทธ๋ฆผ 9>
<๊ทธ๋ฆผ 8>์ ์ํ์์ ์ผ์ชฝ์ผ๋ก ๋ธ๋ก์ ์ฎ๊ธฐ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? 2๊ฐ ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์, 4๋ก ํฉ์ณ์ง๊ฒ ๋๊ณ <๊ทธ๋ฆผ 9>์ ์ํ๊ฐ ๋๋ค.
<๊ทธ๋ฆผ 10> <๊ทธ๋ฆผ 11> <๊ทธ๋ฆผ 12> <๊ทธ๋ฆผ 13>
<๊ทธ๋ฆผ 10>์์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 11>์ ์ํ๊ฐ ๋๋ค.ย <๊ทธ๋ฆผ 12>์ ๊ฒฝ์ฐ์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 13>์ ์ํ๊ฐ ๋๋๋ฐ, ๊ทธ ์ด์ ๋ ํ ๋ฒ์ ์ด๋์์ ์ด๋ฏธ ํฉ์ณ์ง ๋ธ๋ก์ ๋ ํฉ์ณ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
<๊ทธ๋ฆผ 14> <๊ทธ๋ฆผ 15>
๋ง์ง๋ง์ผ๋ก, ๋๊ฐ์ ์๊ฐ ์ธ ๊ฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ํ๋ ค๊ณ ํ๋ ์ชฝ์ ์นธ์ด ๋จผ์ ํฉ์ณ์ง๋ค. ์๋ฅผ ๋ค์ด, ์๋ก ์ด๋์ํค๋ ๊ฒฝ์ฐ์๋ ์์ชฝ์ ์๋ ๋ธ๋ก์ด ๋จผ์ ํฉ์ณ์ง๊ฒ ๋๋ค. <๊ทธ๋ฆผ 14>์ ๊ฒฝ์ฐ์ ์๋ก ์ด๋ํ๋ฉด <๊ทธ๋ฆผ 15>๋ฅผ ๋ง๋ ๋ค. ์ด ๋ฌธ์ ์์ ๋ค๋ฃจ๋ 2048 ๊ฒ์์ ๋ณด๋์ ํฌ๊ธฐ๊ฐ NรN ์ด๋ค. ๋ณด๋์ ํฌ๊ธฐ์ ๋ณด๋ํ์ ๋ธ๋ก ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ต๋ 5๋ฒ ์ด๋ํด์ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ณด๋์ ํฌ๊ธฐ N (1 โค N โค 20)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฒ์ํ์ ์ด๊ธฐ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ์ ๋ํ๋ด๋ฉฐ, ์ด์ธ์ ๊ฐ์ ๋ชจ๋ ๋ธ๋ก์ ๋ํ๋ธ๋ค. ๋ธ๋ก์ ์ฐ์ฌ ์๋ ์๋ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 1024๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ 2์ ์ ๊ณฑ๊ผด์ด๋ค. ๋ธ๋ก์ ์ ์ด๋ ํ๋ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ต๋ 5๋ฒ ์ด๋์์ผ์ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ย ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
3
2 2 2
4 4 4
8 8 8
์ถ๋ ฅ
16
My Sol
def shift_line(arr):
global N
def find_initial_blank(arr):
global N
i = 0
while i < N:
if arr[i]: i += 1
else: return i
return N
def pull_nums(j, ni, arr):
global N
while j < N:
if arr[j]:
arr[ni] = arr[j]
arr[j] = 0
ni += 1
j += 1
return arr
def combine(arr):
global N
j = 1
while j < N:
if arr[j] == arr[j-1]:
arr[j] = 0
arr[j-1] *= 2
j += 1
j += 1
return arr
j = ni = find_initial_blank(arr)
arr = pull_nums(j, ni, arr)
arr = combine(arr)
j = ni = find_initial_blank(arr)
return pull_nums(j, ni, arr)
def DFS(mat, depth):
global N, total_max
if depth == 5:
cur_max = 0
for i in range(N):
for j in range(N):
if cur_max < mat[i][j]:
cur_max = mat[i][j]
total_max = max(total_max, cur_max)
return
DFS(LEFT([line[:] for line in mat]), depth+1)
DFS(RIGHT([line[:] for line in mat]), depth+1)
DFS(UP([line[:] for line in mat]), depth+1)
DFS(DOWN([line[:] for line in mat]), depth+1)
def LEFT(mat):
global N
for i in range(N):
mat[i] = shift_line(mat[i])
return mat
def RIGHT(mat):
global N
for i in range(N):
mat[i] = shift_line(mat[i][::-1])[::-1]
return mat
def UP(mat):
global N
new_mat = [[0]*N for _ in range(N)]
for j in range(N):
arr = []
for i in range(N):
arr.append(mat[i][j])
arr = shift_line(arr)
for i in range(N):
new_mat[i][j] = arr[i]
return new_mat
def DOWN(mat):
global N
new_mat = [[0]*N for _ in range(N)]
for j in range(N):
arr = []
for i in range(N):
arr = [mat[i][j]] + arr
arr = shift_line(arr)
for i in range(N):
new_mat[i][j] = arr.pop()
return new_mat
N = int(input())
mat_origin = [list(map(int, input().split())) for _ in range(N)]
mat = [line[:] for line in mat_origin]
total_max = 0
DFS(mat, 0)
print(total_max)
์ด์ ์ ์คํจํ๋ ๋นก์ผ ๊ตฌํ๋ฌธ์ ์๋ค. ์ฐ์ ์ด 5ํ์ ์๋๋ฅผ ์๊ฐํด๋ณด์์ ๋, ์ํ์ข์ฐ์ ์ด๋ 4๊ฐ์ง์ 5์ ๊ณฑ์ด๋ผ๋ฉด 1024, ์ฝ 1000ํ์ ๋ธ๋ฃจํธํฌ์ค๊ฐ ๊ฐ๋ฅํ๋ค๊ณ ํ๋จ๋์๋ค. ์ด๋ ๊ณง depth๊ฐ ์ต๋ 5์ธ DFS๋ก ์ํฉ์ ๋ชจ๋ ๋ฌด์์ ์๋ํ์ฌ ์ต๋๊ฐ์ ํ์ ํ๋ ๊ฒ์ด๋ค.
ํต์ฌ์ 2์ฐจ์ ๋ฐฐ์ด์์ ์ด๋ ํ ์ด๋์ด๋ ํ ๋ผ์ธ๋ง๋ค์ ๋์์ผ๋ก ์ชผ๊ฐ์ ์๊ฐํด๋ณผ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ์ํ์ข์ฐ ์ด๋ ํ ์ด๋์ด๋ ๋ผ์ธ์ ๊ธฐ์ค์ผ๋ก ํ์ฌ ๋ฏธ๋ฃจ๊ณ ํฉ์ณ์ง ๊ฒฐ๊ณผ ๋ผ์ธ์ ๋ค์ ๋ฐํํ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผ ์ ์ ํ ๊ฐ๊ณตํ์ฌ ๋ชจ๋ ๋ฐฉํฅ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ผ ์ ์๊ฒ ๋ค๊ณ ํ๋จํ์๋ค.
- ์
๋ ฅ์ ์ฒ๋ฆฌํ์ฌ 2์ฐจ์ ๋ฐฐ์ด
mat
์ ๋ง๋ ๋ค. DFS
ํจ์์ mat์ ๋ฃ์ด์ค๋ค.DFS
ํจ์๋ depth๊ฐ 5๊ฐ ๋๋ฉด ๋์ด์์ ์งํ์ ํ์ง ์๊ณ mat ๋ด๋ถ์ ์ต๋๊ฐ์ ํ๋จํ์ฌ ์ ์ญtotal_max
๋ฅผ ๊ฐฑ์ ํ๋ค.DFS
ํจ์๋ ์ํ์ข์ฐ ๋์์ ๊ฒฐ๊ณผ 2์ฐจ์ ๋ฐฐ์ด์ ๋ค์DFS
ํจ์์ ์ฌ๊ท์ ์ผ๋ก ์ธ์๋ก ์ ๋ฌํ๋ค.- ์ํ์ข์ฐ ๋์์ ํด๋นํ๋
LEFT
RIGHT
UP
DOWN
์ ๊ฐ๊ฐ 2์ฐจ์ ๋ฐฐ์ด์ ๊น์ ๋ณต์ฌ ๋ฒ์ ์ ์ ๋ฌํ์ฌ ๋์์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐํ์ํค๊ณ , ์ด๋ฅผ depth๊ฐ ํ๋ ๋ ์ถ๊ฐ๋DFS
ํจ์์ ๋ฐ๋ก ์ ๋ฌํ์ฌ ์ฌ๊ท์ ์ผ๋ก ํ์ธํ๋ค.
์ฃผ์ํ ์ ์ ์ธ์๋ก ๋์ด์ ์ํ์ข์ฐ์ ๋์์ ๊ฐ๊ฐ ์ ๋ฌ๋ mat 2์ฐจ์ ๋ฐฐ์ด์ ๊น์ ๋ณต์ฌ๋ฅผ ํ์ฉํ ๋ณ๊ฐ์ mat์ผ๋ก ์ ๋ฌํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๋ง์ฝ ๊ทธ๋ ์ง ์๋ค๋ฉด ์ผ์ชฝ์ผ๋ก ๋์์ ๋ฏธ๋ฃฌ mat์ด ๊ทธ๋๋ก ๋ค์ RIGHT์ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ๋ ๋ ๋ฆฝ์ ์ธ ๋์๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค.
๋ธ๋ฃจํธํฌ์ค์ด์ง๋ง ๋ฐฑํธ๋ํน์ ์ถฉ๋ถํ ์ผ๋์ ๋ ์ ์๋ค.
๋ฐฑํธ๋ํน 1. ์ด๋ ์ ๊ณผ ํ์ mat ์ํ๊ฐ ๊ฐ๋ค๋ฉด ๋์ด์์ ๊ฐ์ ์ด๋์ ๋ฌด์๋ฏธํ๋ค. ๋ฐฑํธ๋ํน 2. ํ์ฌ depth์ ์ต๋ depth, ๊ทธ๋ฆฌ๊ณ ํ์ฌ ์ต๋๊ฐ๊ณผ ์ ์ญ์ ์ต๋๊ฐ์ ๋น๊ตํด์ 2**(depth์ฐจ์ด)๋งํผ ์ฐจ์ด๊ฐ ๋์ง ์์ผ๋ฉด ๊ทธ ์ดํ์ ์ด๋ ํ ์ด๋์๋ ์ต๋๊ฐ์ ๋์ด์ค ์ ์๋ค. ์๋ํ๋ฉด ํ ๋ฒ ์ด๋์ผ๋ก 2๋ฐฐ ์ด์ ์ปค์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐฑํธ๋ํน ์์๊ฐ ๋ณด์ด์ง๋ง ์ผ๋จ ๋ธ๋ฃจํธํฌ์ค๋ก ํ์๋๋ฐ ์๊ฐ ๋ด์ ์ ํด๊ฒฐ๋์ด์ ๋ ์ด์์ ๋ฐฑํธ๋ํน์ ํ์ฉํ ์ต์ ํ๋ ๋ถํ์ํ์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
# empty
๋๊ธ๋จ๊ธฐ๊ธฐ