[BOJ] 12110.2048(Easy)
by ๋๋ถ๋
12100๋ฒ: 2048 (Easy)
์ฒซ์งธ ์ค์ ๋ณด๋์ ํฌ๊ธฐ N (1 ≤ N ≤ 20)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฒ์ํ์ ์ด๊ธฐ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ์ ๋ํ๋ด๋ฉฐ, ์ด์ธ์ ๊ฐ์ ๋ชจ๋ ๋ธ๋ก์ ๋ํ๋ธ๋ค. ๋ธ๋ก์ ์ฐ์ฌ ์๋ ์๋ 2
www.acmicpc.net
N*N ํฌ๊ธฐ์ ๋ณด๋์์ 2048 ๊ฒ์๊ณผ ์ ์ฌํ๊ฒ ๊ฒ์์ด ์งํ๋ฉ๋๋ค.
2048์ ๊ฒฝ์ฐ ์ด๋ ์ ์๋ก์ด ๋ธ๋ก์ด ์ถ๊ฐ๋์ง๋ง, ํด๋น ๋ฌธ์ ์์๋ ์ฒ์ ์ฃผ์ด์ง ๋ธ๋ก์ผ๋ก๋ง ์งํํฉ๋๋ค.
์ํ์ข์ฐ๋ก ์ด๋์ด ๊ฐ๋ฅํ๋ฉฐ ์ด 5๋ฒ์ ์ด๋ ํ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ๊ฐ์ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ ๋๋ค.
์ด ๋, ์ด๋์ ํ๋ฉฐ ๊ฐ์ ์์ ๋ธ๋ก์ ํฉ์ณ์ง๋๋ค. ๊ทธ๋ฌ๋ ํ ๋ฒ ํฉ์ณ์ง ๋ธ๋ก์ ๋ค์ ํฉ์น ์ ์์ต๋๋ค.
์ฆ, 4 4 8 8 ์ด๋ผ๋ ๋ธ๋ก์ด ์ฃผ์ด์ง๋ฉด ๊ฒฐ๊ณผ๊ฐ 8 16 ์ด ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
๋ธ๋ก์ ๊ฐ์ ๋ชจ๋ ์คํ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, check ๋ณ์๋ฅผ ์ด์ฉํด ๋ธ๋ก์ ํฉ์ณ์ง ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํ์ต๋๋ค.
๋ชจ๋ ์๋ ์คํ์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ๋ธ๋ก์ด ์ด์ ์ ๋ธ๋ก๊ณผ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ฉด ํฉ์ณ์ค๋๋ค.
์คํ์์ ์ด์ ๊ฐ์ ๊บผ๋ด๊ณ ํ์ฌ ๋ธ๋ก๊ณผ ๋ํด์ค ํ ์คํ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์งํํ์ต๋๋ค.
์ด ๋, check ๋ณ์๋ฅผ 1๋ก ๋ง๋ค์ด ์ฃผ์ด ๋ค์ ๋ธ๋ก์ ๊ฐ์ด ๊ฐ์ ๊ฐ์ด๋๋ผ๋ ๋ํ ์ ์๊ฒ ํ์ต๋๋ค.
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import sys
def up(board) : # ์๋ก ์ด๋
for c in range(N) : # N๋ฒ ๋ฐ๋ณต์ ํตํด ๋ชจ๋ ์ด์ ๋ํด ์ํ
stack = []
check = 0
for r in range(N) :
if board[r][c] > 0 :
if len(stack) > 0 and stack[-1] == board[r][c] and check == 0 :
stack.append(stack.pop() + board[r][c])
check = 1
else :
stack.append(board[r][c])
check = 0
for r in range(N) :
if 0 <= r < len(stack) : board[r][c] = stack[r]
else : board[r][c] = 0
return board
def down(board) : # ์๋๋ก ์ด๋
for c in range(N) : # N๋ฒ ๋ฐ๋ณต์ ํตํด ๋ชจ๋ ์ด์ ๋ํด ์ํ
stack = []
check = 0
for r in range(N - 1, -1, -1) :
if board[r][c] > 0 :
if len(stack) > 0 and stack[-1] == board[r][c] and check == 0 :
stack.append(stack.pop() + board[r][c])
check = 1
else :
stack.append(board[r][c])
check = 0
for r in range(N) :
if 0 <= (N - r - 1) < len(stack) : board[r][c] = stack[N - r - 1]
else : board[r][c] = 0
return board
def left(board) : # ์ผ์ชฝ์ผ๋ก ์ด๋
for r in range(N) : # N๋ฒ ๋ฐ๋ณต์ ํตํด ๋ชจ๋ ์ด์ ๋ํด ์ํ
stack = []
check = 0
for c in range(N) :
if board[r][c] > 0 :
if len(stack) > 0 and stack[-1] == board[r][c] and check == 0 :
stack.append(stack.pop() + board[r][c])
check = 1
else :
stack.append(board[r][c])
check = 0
for c in range(N) :
if 0 <= c < len(stack) : board[r][c] = stack[c]
else : board[r][c] = 0
return board
def right(board) : # ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
for r in range(N) : # N๋ฒ ๋ฐ๋ณต์ ํตํด ๋ชจ๋ ์ด์ ๋ํด ์ํ
stack = []
check = 0
for c in range(N - 1, -1, -1) :
if board[r][c] > 0 :
if len(stack) > 0 and stack[-1] == board[r][c] and check == 0 :
stack.append(stack.pop() + board[r][c])
check = 1
else :
stack.append(board[r][c])
check = 0
for c in range(N) :
if 0 <= (N - c - 1) < len(stack) : board[r][c] = stack[N - c - 1]
else : board[r][c] = 0
return board
def find_max(board) :
global max_
for b in board :
temp = max(b)
max_ = max(max_, temp)
def dfs(copy_board, L) :
global max_
if L == 5 :
find_max(copy_board)
return
dfs(up([copy[:] for copy in copy_board]), L + 1)
dfs(down([copy[:] for copy in copy_board]), L + 1)
dfs(left([copy[:] for copy in copy_board]), L + 1)
dfs(right([copy[:] for copy in copy_board]), L + 1)
if __name__=="__main__" :
input = sys.stdin.readline
N = int(input()) # ๋ณด๋ ํฌ๊ธฐ
board = [list(map(int, input().split())) for _ in range(N)]
max_ = 0
dfs(board, 0)
print(max_)
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 14890.๊ฒฝ์ฌ๋ก (Python) (0) | 2021.04.20 |
---|---|
[BOJ] 1929.์์๊ตฌํ๊ธฐ (Python) (0) | 2021.04.19 |
[BOJ] 13549.์จ๋ฐ๊ผญ์ง 3 (Python) (0) | 2021.04.18 |
[BOJ] 1918.ํ์ํ๊ธฐ์ (Python) (0) | 2021.04.17 |
[BOJ] 1105.ํ (Python) (0) | 2021.04.16 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
๋๋ถ๋์ Devlog
๋๋ถ๋