[BOJ][๐ŸŸก2][๋ฐฑ์ค€#12100] 2048 (Easy)

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #12100


๋ฌธ์ œ

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์ฐจ์› ๋ฐฐ์—ด์—์„œ ์–ด๋– ํ•œ ์ด๋™์ด๋“  ํ•œ ๋ผ์ธ๋งˆ๋‹ค์˜ ๋™์ž‘์œผ๋กœ ์ชผ๊ฐœ์„œ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์ƒํ•˜์ขŒ์šฐ ์–ด๋– ํ•œ ์ด๋™์ด๋“  ๋ผ์ธ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜์—ฌ ๋ฏธ๋ฃจ๊ณ  ํ•ฉ์ณ์ง„ ๊ฒฐ๊ณผ ๋ผ์ธ์„ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ์ ์ ˆํžˆ ๊ฐ€๊ณตํ•˜์—ฌ ๋ชจ๋“  ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค.

  1. ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ 2์ฐจ์› ๋ฐฐ์—ด mat์„ ๋งŒ๋“ ๋‹ค.
  2. DFS ํ•จ์ˆ˜์— mat์„ ๋„ฃ์–ด์ค€๋‹ค.
  3. DFS ํ•จ์ˆ˜๋Š” depth๊ฐ€ 5๊ฐ€ ๋˜๋ฉด ๋”์ด์ƒ์˜ ์ง„ํ–‰์„ ํ•˜์ง€ ์•Š๊ณ  mat ๋‚ด๋ถ€์˜ ์ตœ๋Œ“๊ฐ’์„ ํŒ๋‹จํ•˜์—ฌ ์ „์—ญ total_max๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
  4. DFS ํ•จ์ˆ˜๋Š” ์ƒํ•˜์ขŒ์šฐ ๋™์ž‘์˜ ๊ฒฐ๊ณผ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋‹ค์Œ DFS ํ•จ์ˆ˜์— ์žฌ๊ท€์ ์œผ๋กœ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  5. ์ƒํ•˜์ขŒ์šฐ ๋™์ž‘์— ํ•ด๋‹นํ•˜๋Š” LEFT RIGHT UP DOWN ์— ๊ฐ๊ฐ 2์ฐจ์› ๋ฐฐ์—ด์˜ ๊นŠ์€ ๋ณต์‚ฌ ๋ฒ„์ „์„ ์ „๋‹ฌํ•˜์—ฌ ๋™์ž‘์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ฐ˜ํ™˜์‹œํ‚ค๊ณ , ์ด๋ฅผ depth๊ฐ€ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€๋œ DFS ํ•จ์ˆ˜์— ๋ฐ”๋กœ ์ „๋‹ฌํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ํ™•์ธํ•œ๋‹ค.


์ฃผ์˜ํ•  ์ ์€ ์ธ์ž๋กœ ๋„˜์–ด์™€ ์ƒํ•˜์ขŒ์šฐ์˜ ๋™์ž‘์— ๊ฐ๊ฐ ์ „๋‹ฌ๋  mat 2์ฐจ์› ๋ฐฐ์—ด์€ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ™œ์šฉํ•œ ๋ณ„๊ฐœ์˜ mat์œผ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์™ผ์ชฝ์œผ๋กœ ๋™์ž‘์„ ๋ฏธ๋ฃฌ mat์ด ๊ทธ๋Œ€๋กœ ๋‹ค์Œ RIGHT์— ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ๋™์ž‘๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค.


๋ธŒ๋ฃจํŠธํฌ์Šค์ด์ง€๋งŒ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ถฉ๋ถ„ํžˆ ์—ผ๋‘์— ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น 1. ์ด๋™ ์ „๊ณผ ํ›„์˜ mat ์ƒํƒœ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋”์ด์ƒ์˜ ๊ฐ™์€ ์ด๋™์€ ๋ฌด์˜๋ฏธํ•˜๋‹ค. ๋ฐฑํŠธ๋ž˜ํ‚น 2. ํ˜„์žฌ depth์™€ ์ตœ๋Œ€ depth, ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์ตœ๋Œ“๊ฐ’๊ณผ ์ „์—ญ์˜ ์ตœ๋Œ“๊ฐ’์„ ๋น„๊ตํ•ด์„œ 2**(depth์ฐจ์ด)๋งŒํผ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š์œผ๋ฉด ๊ทธ ์ดํ›„์˜ ์–ด๋– ํ•œ ์ด๋™์—๋„ ์ตœ๋Œ“๊ฐ’์„ ๋„˜์–ด์„ค ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•œ ๋ฒˆ ์ด๋™์œผ๋กœ 2๋ฐฐ ์ด์ƒ ์ปค์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น ์š”์†Œ๊ฐ€ ๋ณด์ด์ง€๋งŒ ์ผ๋‹จ ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ํ’€์—ˆ๋Š”๋ฐ ์‹œ๊ฐ„ ๋‚ด์— ์ž˜ ํ•ด๊ฒฐ๋˜์–ด์„œ ๋” ์ด์ƒ์˜ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ™œ์šฉํ•œ ์ตœ์ ํ™”๋Š” ๋ถˆํ•„์š”ํ•˜์˜€๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

# empty

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ