๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

[๋ฐฑ์ค€] 12100 2048(easy) (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2022. 7. 25. 16:35

https://www.acmicpc.net/problem/12100

 

12100๋ฒˆ: 2048 (Easy)

์ฒซ์งธ ์ค„์— ๋ณด๋“œ์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฒŒ์ž„ํŒ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด์™ธ์˜ ๊ฐ’์€ ๋ชจ๋‘ ๋ธ”๋ก์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ธ”๋ก์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๋Š” 2

www.acmicpc.net


์•„์ด๋””์–ด

1. ๊ตฌํ˜„์ด ๋จผ์ €

  • ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  N์ตœ๋Œ€๊ฐ€ 20์ด๊ณ  ์ด๋™๋„ 5๋ฒˆ ํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋งํ•œ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ.
  • ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ด๋™ ์ค‘์— '์ขŒ'๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•˜๋ฉด ๋‚˜๋จธ์ง€๋„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ๋งŒ๋“ค์ˆ˜๋ก ๋ณ€์ˆ˜๋‚˜ if๋ฌธ์ด ๋งŽ์•„์ ธ ๋‹ค์‹œ ๋ฐ€๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž‘์„ฑํ–ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๋ณ€์ˆ˜๋Š” ํ•„์š” ์—†๋‹ค. ์ด๊ฑด ๋‹ค๋ฅธ ๊ตฌํ˜„ ๋ฌธ์ œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ๊ณ  ์ƒ๊ฐ.
  • '์ด๋™์‹œํ‚ฌ ๋ธ”๋ก'๊ณผ '๊ทธ ๋ธ”๋ก์ด ์ด๋™ํ–ˆ์„ ๋•Œ ๋„์ฐฉํ•˜๋Š” ๊ณณ์— ์žˆ๋Š” ๋ธ”๋ก'(๋ง์ด ์ข€ ์ด์ƒํ•˜๊ธด ํ•œ๋ฐ) ๋‘ ๊ฐœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค.

2. ๋ฐฑํŠธ๋ž˜ํ‚น๊ณผ ๋ธŒ๋ฃจํŠธ ํฌ์Šค

  • ์ƒํ•˜์ขŒ์šฐ ์ด๋™ ๊ทธ๋ฆฌ๊ณ  ์ตœ๋Œ€ 5๋ฒˆ ์ด๋™์ด๋ฏ€๋กœ 4^5(1024)๊ฐœ์˜ ๊ฒฝ์šฐ๋งŒ ๊ณ ๋ คํ•˜๋ฉด ๋œ๋‹ค.
  • ๋ธŒ๋ฃจํŠธ ํฌ์Šค ๋ฐฉ๋ฒ•์œผ๋กœ ํ•˜๋‚˜ํ•˜๋‚˜ ์ „๋ถ€๋‹ค ํ•ด๋ณด๋ฉด ๋œ๋‹ค.
  • ์ด์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ deepcopy๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆ„์—ˆ๋‹ค.

 


์ „์ฒด ์ฝ”๋“œ

import sys, copy
N = int(input())
pan = []
ans = 0

for _ in range(N):
    pan.append([int(x) for x in sys.stdin.readline().rstrip().split()])

def left(board):
    for i in range(N):
        cursor = 0
        for j in range(1, N):
            if board[i][j] != 0: # 0์ด ์•„๋‹Œ ๊ฐ’์ด
                tmp = board[i][j]
                board[i][j] = 0 # ์ผ๋‹จ ๋น„์›Œ์งˆ๊บผ๋‹ˆ๊นŒ 0์œผ๋กœ ๋ฐ”๊ฟˆ

                if board[i][cursor] == 0: # ๋น„์–ด์žˆ์œผ๋ฉด
                    board[i][cursor] = tmp # ์˜ฎ๊ธด๋‹ค

                elif board[i][cursor] == tmp: # ๊ฐ™์œผ๋ฉด
                    board[i][cursor] *= 2 # ํ•ฉ์นœ๋‹ค
                    cursor += 1
                else: # ๋น„์–ด์žˆ์ง€๋„ ์•Š๊ณ  ๋‹ค๋ฅธ ๊ฐ’์ผ๋•Œ
                    cursor += 1 # pass
                    board[i][cursor] = tmp # ๋ฐ”๋กœ ์˜†์— ๋ถ™์ž„

    return board

def right(board):
    for i in range(N):
        cursor = N - 1
        for j in range(N - 1, -1, -1):

            if board[i][j] != 0:
                tmp = board[i][j]
                board[i][j] = 0

                if board[i][cursor] == 0:
                    board[i][cursor] = tmp

                elif board[i][cursor] == tmp:
                    board[i][cursor] *= 2
                    cursor -= 1
                else:
                    cursor -= 1
                    board[i][cursor] = tmp
    return board

def up(board):
    for j in range(N):
        cursor = 0
        for i in range(N):
            if board[i][j] != 0:
                tmp = board[i][j]
                board[i][j] = 0

                if board[cursor][j] == 0:
                    board[cursor][j] = tmp

                elif board[cursor][j] == tmp:
                    board[cursor][j] *= 2
                    cursor += 1

                else:
                    cursor += 1
                    board[cursor][j] = tmp
    return board

def down(board):
    for j in range(N):
        cursor = N - 1
        for i in range(N - 1, -1, -1):
            if board[i][j] != 0:
                tmp = board[i][j]
                board[i][j] = 0

                if board[cursor][j] == 0:
                    board[cursor][j] = tmp

                elif board[cursor][j] == tmp:
                    board[cursor][j] *= 2
                    cursor -= 1

                else:
                    cursor -= 1
                    board[cursor][j] = tmp
    return board

def dfs(n, arr):
    global ans
    if n == 5:
        for i in range(N):
            for j in range(N):
                if arr[i][j] > ans:
                    ans = arr[i][j]
        return

    for i in range(4):
        copy_arr = copy.deepcopy(arr)
        if i == 0:
            dfs(n + 1, left(copy_arr))
        elif i == 1:
            dfs(n + 1, right(copy_arr))
        elif i == 2:
            dfs(n + 1, up(copy_arr))
        else:
            dfs(n + 1, down(copy_arr))

dfs(0, pan)
print(ans)

์ฝ”๋“œ ์„ค๋ช…

 

def left(board):
    for i in range(N):
        cursor = 0
        for j in range(1, N):
            if board[i][j] != 0: # 0์ด ์•„๋‹Œ ๊ฐ’์ด
                tmp = board[i][j]
                board[i][j] = 0 # ์ผ๋‹จ ๋น„์›Œ์งˆ๊บผ๋‹ˆ๊นŒ 0์œผ๋กœ ๋ฐ”๊ฟˆ

                if board[i][cursor] == 0: # ๋น„์–ด์žˆ์œผ๋ฉด
                    board[i][cursor] = tmp # ์˜ฎ๊ธด๋‹ค

                elif board[i][cursor] == tmp: # ๊ฐ™์œผ๋ฉด
                    board[i][cursor] *= 2 # ํ•ฉ์นœ๋‹ค
                    cursor += 1
                else: # ๋น„์–ด์žˆ์ง€๋„ ์•Š๊ณ  ๋‹ค๋ฅธ ๊ฐ’์ผ๋•Œ
                    cursor += 1 # pass
                    board[i][cursor] = tmp # ๋ฐ”๋กœ ์˜†์— ๋ถ™์ž„
    return board

๋จผ์ € ๋ธ”๋ก์„ ์ด๋™์‹œํ‚ค๋Š” ์ฝ”๋“œ.

๋‚˜๋จธ์ง€ ์ƒ, ํ•˜, ์šฐ ๋ฐฉ๋ฒ•๋„ ๋น„์Šทํ•˜๋ฏ€๋กœ ์ขŒ๋กœ ์›€์ง์ผ ๋•Œ ์ฝ”๋“œ๋งŒ ์„ค๋ช….

์„ค๋ช…์€ ์ฃผ์„์œผ๋กœ ํ•˜๋Š”๊ฒŒ ํŽธํ•  ๊ฑฐ ๊ฐ™์•„์„œ ์ฃผ์„์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ–ˆ๋‹ค.

์˜ฎ๊ธธ ๋ธ”๋ก์€ board[i][j], ์˜ฎ๊ธธ ๋ธ”๋ก๊ณผ ๋ฐ”๊ฟ€ ์ž๋ฆฌ๋Š” board[i][cursor]์ด๋‹ค.

 

 

def dfs(n, arr):
    global ans
    if n == 5:
        for i in range(N):
            for j in range(N):
                if arr[i][j] > ans:
                    ans = arr[i][j]
        return

    for i in range(4):
        copy_arr = copy.deepcopy(arr)
        if i == 0:
            dfs(n + 1, left(copy_arr))
        elif i == 1:
            dfs(n + 1, right(copy_arr))
        elif i == 2:
            dfs(n + 1, up(copy_arr))
        else:
            dfs(n + 1, down(copy_arr))

n์ด 5๊ฐ€ ๋˜๋ฉด(๋ธ”๋ก์„ 5๋ฒˆ ์ด๋™ํ•˜๋ฉด) ํ˜„์žฌ ์žˆ๋Š” ์ด์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ์•„ ์ €์žฅํ•˜๊ณ  return ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ƒ, ํ•˜, ์ขŒ, ์šฐ case ๋”ฐ๋กœ๋”ฐ๋กœ ํ™•์ธ์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด์ฐจ์› ๋ฐฐ์—ด์„ deepcopy๋กœ ๋ณต์‚ฌํ•ด์„œ dfsํ•จ์ˆ˜์— ๋„ฃ์–ด์ค€๋‹ค.