๐Ÿถ Programming/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€๊ธฐ

BOJ. 12100 2048 (Easy) (Python)

์ง€ ์› 2022. 10. 7. 09:30

BOJ 12100. 2048 (Easy)

๋ฌธ์ œ

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

 

12100๋ฒˆ: 2048 (Easy)

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

www.acmicpc.net

 

๐Ÿ”ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

5๋ฒˆ๋ฐ–์— ์•ˆ์›€์ง์ด๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ–ˆ๋‹ค. ๋ธŒ๋ฃจํŠธ ํฌ์Šค! ์™„ํƒ!

์•„๋ž˜๋กœ ์›€์ง์ด๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ‘์— ์žˆ๋Š” ๊ฒƒ๋“ค ๋จผ์ € ํ•ฉ์ณ์ง€๊ณ , ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์›€์ง์ด๋ฉด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฒƒ๋“ค ๋จผ์ € ํ•ฉ์ณ์ง€๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜์ง€ ์œ„ํ•ด์„œ move Range๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฒ”์œ„ ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค.

4 2 2 ์ธ ๊ฒƒ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐ€์–ด์„œ ํ•ฉ์น˜๋ฉด 4 4 ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฒˆ์— ํ•ฉ์ณ์ง„ ๊ฒƒ๋“ค์„ ํ‘œ์‹œ ์•ˆํ•˜๊ณ  ๊ทธ๋ƒฅ ๊ฐ™์œผ๋ฉด ํ•ฉ์น˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด 4 4 ์ธ ๊ฒฝ์šฐ์—๋„ ๊ฐ™๋‹ค๊ณ  ํŒ๋‹จํ•ด์„œ 8์ด ๋‚˜์˜จ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ด๊ฒƒ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š์•˜์—ˆ๋‹ค.

moved ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฒˆ์— ํ•ฉ์ณ์ง„ ๊ฒƒ๋“ค์€ ํ•œ๋ฒˆ ๋” ์•ˆํ•ฉ์ณ์ง€๋Š” ๊ฒƒ์„ ์ฒดํฌํ•ด์ฃผ๊ณ ๋‚˜๋‹ˆ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

# 12100 2048(Easy)
# 220926

import sys
input = sys.stdin.readline

# ์œ„ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์™ผ์ชฝ
di = [-1, 0, 1, 0]
dj = [0, 1, 0, -1]

N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
answer = 0

moveRange = {
    0 : [range(N), range(N)],
    1 : [range(N), range(N-1, -1, -1)],
    2 : [range(N-1, -1, -1), range(N)],
    3 : [range(N), range(N)],
    }

def move(arrMove, d):
    moved = [[0]*N for _ in range(N)]

    iRange, jRange = moveRange[d]
    for i in iRange:
        for j in jRange:
            num = arrMove[i][j]
            if num :
                ni = i + di[d]
                nj = j + dj[d]
                pi, pj = i, j

                while (0 <= ni < N) and (0<= nj < N):
                    # ๋นˆ์นธ์ธ ๊ฒฝ์šฐ -> ์ด๋™
                    if arrMove[ni][nj] == 0:
                        arrMove[pi][pj] = 0
                        arrMove[ni][nj] = num

                        pi, pj = ni, nj
                        ni = pi + di[d]
                        nj = pj + dj[d]
                    # ๊ฐ™์€ ์ˆซ์ž์ธ ๊ฒฝ์šฐ ๋”ํ•˜๊ธฐ
                    elif (arrMove[ni][nj] == num) and (moved[ni][nj] == 0):
                        arrMove[pi][pj] = 0
                        arrMove[ni][nj] = 2 * num
                        # ์ด๋ฒˆ์— ํ•ฉ์นœ ๊ฑฐ ํ‘œ์‹œ
                        moved[ni][nj] = 1
                        break
                    # ๋‹ค๋ฅธ ์ˆซ์ž์ธ ๊ฒฝ์šฐ ์ด๋™x
                    else:
                        break

    return arrMove

def play(arrPlay, K):
    global answer

    if K == 0:
        tmp = max([max(arrPlay[i]) for i in range(N)])
        if tmp > answer:
            answer = tmp
        return 

    # ์œ„์•„๋ž˜์˜ค๋ฅธ์ชฝ์™ผ์ชฝ ์ด๋™ ๊ฐ€๋Šฅ
    for d in range(4):
        # ๋”ฅ์นดํ”ผ
        arrTmp = [arrPlay[i][:] for i in range(N)]
        # ์ด๋™ํ›„ ๊ฒฐ๊ณผ ๋ฐฐ์—ด ๋ฐ˜ํ™˜
        arrMoved = move(arrTmp, d)
        play(arrMoved, K-1)

    return 

# ์ตœ๋Œ€ 5๋ฒˆ ์ด๋™ ๊ฐ€๋Šฅ
play(arr, 5)

print(answer)

๐Ÿ”‘ Key Point

๐Ÿ”ธ ๋จผ์ € ํ•ฉ์ณ์ง€๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ฒ”์œ„ ์„ค์ •์„ ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ”ธ ํ•ฉ์ณ์ง€๋Š” ๊ณผ์ •์ด ํ•œ์ค„์”ฉ ์ผ์–ด๋‚˜๋‹ˆ๊นŒ ํ•œ์ค„์”ฉ ๋ด์„œ ํ•ฉ์ณ์ง€๋Š” ๊ฒƒ์„ ํŒ๋‹จํ•˜๊ฑฐ๋‚˜, ํ•ฉ์นœ ๊ฒƒ๋“ค์€ ๋”ฐ๋กœ ํ‘œ์‹œํ•ด์„œ ์ค‘๋ณตํ•ด์„œ ํ•ฉ์ณ์ง€๋Š” ์ผ์ด ์—†๊ฒŒ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.