๋ฌธ์ ์์ ์๋ ค์ค 2048 ๊ฒ์ ๋ฃฐ์ ์๋์ ๊ฐ๋ค.
์ด๋ํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ์ซ์๊ฐ ์ฐ์์ผ๋ก 2๊ฐ ์๋ค๋ฉด ํฉ์ณ์ง๋ค.
(๋จ, ๋น์นธ์ ๊ณ ๋ คํ์ง ์๋๋ค.)
- ๊ทธ๋ฆผ์์ ์ผ์ชฝ์ผ๋ก ์ด๋
ํ ๋ฐฉํฅ์ผ๋ก ์ฌ๋ฌ๊ฐ๊ฐ ์๋ค๋ฉด ์ด๋ํ๋ ๋ฐฉํฅ ์ชฝ์ ์์นํ 2๊ฐ๋ฅผ ๋จผ์ ํฉ์น๋ค.
- ๊ทธ๋ฆผ์์ ์์ชฝ์ผ๋ก ์ด๋
์ด๋ฏธ ํ ๋ฒ์ ์ด๋์ผ๋ก ๋ค๋ฅธ ์ซ์์ ํฉ์ณ์ง ์ซ์๋ ๋ ๋ค๋ฅธ ์ซ์์๋ ํฉ์ณ์ง ์ ์๋ค.
- 2+2๋ 4๊ฐ ๋์ง๋ง 4+4๊ฐ 8์ด๋ ์๋ ์๋ค. ์ด๋ฏธ ์๋ก ์ด๋ํ๋ฉด์ 2,2๊ฐ ๊ฐ๊ฐ ํฉ์ณ์ ธ์ 4๊ฐ ๋์๊ธฐ ๋๋ฌธ.
๋ณด๋ํ์ ์ต๋ ํฌ๊ธฐ๋ 20x20์ด๋ฉฐ ์ด 5๋ฒ ์งํ๊ฐ๋ฅํ๋ค. ๊ฐ๊ฐ์ ๊ฒฝ์ฐ์ ์ํ์ข์ฐ ๋ชจ๋ ๊ณ ๋ คํด์ผ ํ๋ฏ๋ก 4^5 = ๋๋ต 4์ฒ๋ฒ ์ดํ๋ก ์์ ํ์์ผ๋ก ์งํ ๊ฐ๋ฅํ๋ค. ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๊ณ ์ต๋๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค.
์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฐ ๊ฐ์ ํ์ํ๊ธฐ ๊ฐ์ฅ ํธํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์ค์ผ๋ก ์ ํ๋ค. ๊ฐ์ฅ ์ผ์ชฝ์ ์์นํ ์ซ์๋ฅผ i
๋ก ์ค์ ํ๊ณ ๊ทธ ๋ค์ ๊ฐ์ j
๋ก ์ค์ ํ์ฌ j
๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๋ฉฐ 1) ๊ฐ์ ๊ฐ์ด ์๋์ง 2) ๋ค๋ฅธ ๊ฐ์ด ์๋์ง๋ฅผ ํ์ํ๋ค. ๋ง์ฝ ๊ฐ๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ด ์๊ณ ์ ๋ถ๋ค ๋น์นธ์ด๋ผ๋ฉด ํ์์ ์ข
๋ฃํ๋ค.
ํ์์ ๊ธฐ์ค์ด ๋๋ ๊ฐ i
๊ฐ ๋น ์นธ์ด๋ผ๋ฉด ๊ทธ๋๋ก ๋์ด๊ฐ๋ค.
๋น ์นธ์ด ์๋๋ผ๋ฉด ๋ค์ ๊ฐ๋ถํฐ ์์ํด์ ๊ฐ์ ํ์ํ๋ค. ๋ง์ฝ j
์ ์์นํ ๊ฐ์ด ๋น ์นธ์ด๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ด๊ฐ๋ค. ๋น ์นธ์ด ์๋๋ผ๋ฉด ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ก ๋๋๊ฒ ๋๋ค. ๊ฐ์ ์ซ์์ธ ๊ฒฝ์ฐ๋ ๋ํ๊ณ , ๋ค๋ฅธ ์ซ์์ธ ๊ฒฝ์ฐ๋ ๊ทธ ์ซ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํ์ชฝ ๋ฐฉํฅ์ผ๋ก ๋ชจ๋ ๋ธ๋ก์ ์ด๋์ํค๊ฒ ๋๋ฉด ๋น ์นธ์ด ์๋ ๊ฐ๋ค๋ง ํ์ชฝ์ผ๋ก ์์ด๊ฒ ๋๋ค. ๋น ์นธ์ ์ ์ธํ ๊ฐ๋ค๋ง ํ๋์ฉ ์ฐจ๋ก๋๋ก ๊ตฌํด์ ์์๋ฐฐ์ด์ ์ถ๊ฐํ๊ณ , ๋ชจ๋ ๊ตฌํ๋ค๋ฉด ์ ์ฒด ์ด์ ๊ธธ์ด๋งํผ ๋น์นธ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
์ผ์ชฝ -> ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ํด๋๊ฐ๋ ์ฝ๋๊ฐ ๊ธฐ์ค์ด๋ค. ์ฆ ๋ชจ๋ ๋ธ๋ก์ด ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ๊ฐ ๊ธฐ์ค์ด ๋๋ค. ์, ์๋, ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ๋ค์ 2์ฐจ์ ๋ฐฐ์ด์ ํ์ ์์ผ์ ๊ณ์ฐํ ํ ๋ค์ ํ์ ์ํจ ๊ฐ์ ๋ฐํํ๋ค.
# 2048 (Easy)
def rotate(dir, board):
if dir == 1: # UP
arr = move(list(map(list, zip(*board))))
return list(map(list, zip(*arr)))
elif dir == 2: # DOWN
arr = move(list(map(list, zip(*board[::-1]))))
return list(map(list, zip(*arr)))[::-1]
elif dir == 3: # RIGHT
arr = move(row[::-1] for row in board)
return [row[::-1] for row in arr]
else: # LEFT
return move(board)
def move(board):
arr = []
for row in board:
i = -1
tmp = []
while i<N-1:
i += 1
if not row[i]:
continue
j = i
while j<N-1:
j += 1
# ๋น ์นธ์ธ ๊ฒฝ์ฐ
if not row[j]:
continue
# ๊ฐ์ ๊ฐ์ธ ๊ฒฝ์ฐ
if row[j] == row[i]:
tmp.append(2*row[i])
i = j
break
# ๋ค๋ฅธ ๊ฐ์ธ ๊ฒฝ์ฐ
if row[j] != row[i]:
tmp.append(row[i])
i = j-1
break
# ์๋ฌด๋ฐ ๊ฐ๋ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ ๊ทธ๋ฅ ๊ทธ ๊ฐ์ ์ถ๊ฐ
else:
tmp.append(row[i])
break
arr.append(tmp+[0]*(N-len(tmp)))
return arr
def game(round, board):
global answer
if round == 5:
for row in board:
answer = max(answer, max(row))
return
for d in range(4):
tmp = rotate(d, [row[:] for row in board])
game(round+1, tmp)
N = int(input())
board = [list(map(int, input().split())) for _ in range(N)]
answer = 0
game(0, board)
print(answer)