๋šœ๋ถ€๋‹ˆ์˜ Devlog

[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_)
 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

๋šœ๋ถ€๋‹ˆ์˜ Devlog

๋šœ๋ถ€๋‹ˆ

ํ™œ๋™ํ•˜๊ธฐ