πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON python] 12100_2048(easy)

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 10. 10. 16:54
728x90
λ°˜μ‘ν˜•
ν•œ 번의 이동은 λ³΄λ“œ μœ„μ— μžˆλŠ” 전체 블둝을 μƒν•˜μ’Œμš° λ„€ λ°©ν–₯ 쀑 ν•˜λ‚˜λ‘œ μ΄λ™μ‹œν‚€λŠ” 것
같은 값을 κ°–λŠ” 두 블둝이 μΆ©λŒν•˜λ©΄ 두 블둝은 ν•˜λ‚˜λ‘œ ν•©μ³μ§€κ²Œ λœλ‹€.
ν•œ 번의 μ΄λ™μ—μ„œ 이미 합쳐진 블둝은 또 λ‹€λ₯Έ 블둝과 λ‹€μ‹œ ν•©μ³μ§ˆ 수 μ—†λ‹€.
(μ‹€μ œ κ²Œμž„μ—μ„œλŠ” 이동을 ν•œ 번 ν•  λ•Œλ§ˆλ‹€ 블둝이 μΆ”κ°€λ˜μ§€λ§Œ, 이 λ¬Έμ œμ—μ„œ 블둝이 μΆ”κ°€λ˜λŠ” κ²½μš°λŠ” μ—†λ‹€)

λ˜‘κ°™μ€ μˆ˜κ°€ μ„Έ κ°œκ°€ μžˆλŠ” κ²½μš°μ—λŠ” μ΄λ™ν•˜λ €κ³  ν•˜λŠ” μͺ½μ˜ 칸이 λ¨Όμ € 합쳐진닀.

이 λ¬Έμ œμ—μ„œ λ‹€λ£¨λŠ” 2048 κ²Œμž„은 λ³΄λ“œμ˜ 크기가 N×N 이닀.
λ³΄λ“œμ˜ 크기와 λ³΄λ“œνŒμ˜ 블둝 μƒνƒœκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ,

μ΅œλŒ€ 5번 μ΄λ™ν•΄μ„œ λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 λΈ”λ‘μ˜ 값을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±


첫째 쀄에 λ³΄λ“œμ˜ 크기 N (1 ≤ N ≤ 20)이 주어진닀.

λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” κ²Œμž„νŒμ˜ 초기 μƒνƒœκ°€ 주어진닀.
0은 λΉˆ 칸을 λ‚˜νƒ€λ‚΄λ©°, μ΄μ™Έμ˜ 값은 λͺ¨λ‘ 블둝을 λ‚˜νƒ€λ‚Έλ‹€.
블둝에 μ“°μ—¬ μžˆλŠ” μˆ˜λŠ” 2보닀 ν¬κ±°λ‚˜ κ°™κ³ , 1024보닀 μž‘κ±°λ‚˜ 같은 2의 μ œκ³±κΌ΄μ΄λ‹€.
블둝은 적어도 ν•˜λ‚˜ 주어진닀.

μ΅œλŒ€ 5번 μ΄λ™μ‹œμΌœμ„œ 얻을 수 μžˆλŠ” κ°€μž₯ 큰 블둝을 좜λ ₯
from copy import deepcopy
N = int(input())

graph = []
for i in range(N) :
    graph.append(list(map(int, input().split())))
result = 0

def left(graph) :
    for i in range(N) :
        # μ—΄ κ°€μž₯ μ™Όμͺ½
        p = 0
        x = 0
        for j in range(N) :
            # 빈칸
            if graph[i][j] == 0 :
                continue
            # λ”ν• κ²Œ μ—†λ‹€λ©΄
            if x == 0 :
                x = graph[i][j]
            # λ”ν• κ²Œ μžˆλŠ”λ°, μˆ«μžκ°€ 같은가?
            else :
                if x == graph[i][j] :
                    graph[i][p] = x * 2
                    x = 0
                    p += 1
                else :
                    graph[i][p] = x
                    x = graph[i][j]
                    p += 1
            # λΉ„μ›Œμ£ΌκΈ°
            graph[i][j] = 0

        # μ’ŒμΈ‘μ—μ„œ 우츑 λκΉŒμ§€ 도달!
        if x != 0 :
            graph[i][p] = x

    return graph

def right(graph) : 
    for i in range(N) :
        # κ°€μž₯ 우츑 μ—΄
        p = N - 1
        x = 0
        for j in range(N - 1, -1 , -1) :
            # 빈칸
            if graph[i][j] == 0 :
                continue
            # λ”ν• κ²Œ μ—†λ‹€λ©΄
            if x == 0 :
                x = graph[i][j]
            # λ”ν• κ²Œ μžˆλŠ”λ°, μˆ«μžκ°€ 같은가?
            else :
                if x == graph[i][j] :
                    graph[i][p] = x * 2
                    x = 0
                    p -= 1
                else :
                    graph[i][p] = x
                    x = graph[i][j]
                    p -= 1
            # λΉ„μ›Œμ£ΌκΈ°
            graph[i][j] = 0

        # μš°μΈ‘μ—μ„œ 쒌츑 λκΉŒμ§€ 도달!
        if x != 0 :
            graph[i][p] = x

    return graph

def up(graph) : 
    for i in range(N) :
        # κ°€μž₯ μœ„ ν–‰
        p = 0
        x = 0
        for j in range(N) :
            # 빈칸
            if graph[j][i] == 0 :
                continue
            # λ”ν• κ²Œ μ—†λ‹€λ©΄
            if x == 0 :
                x = graph[j][i]
            # λ”ν• κ²Œ μžˆλŠ”λ°, μˆ«μžκ°€ 같은가?
            else :
                if x == graph[j][i] :
                    graph[p][i] = x * 2
                    x = 0
                    p += 1
                else :
                    graph[p][i] = x
                    x = graph[j][i]
                    p += 1
            # λΉ„μ›Œμ£ΌκΈ°
            graph[j][i] = 0

        # μœ„μΈ‘μ—μ„œ μ•„λž˜μΈ‘ λκΉŒμ§€ 도달!
        if x != 0 :
            graph[p][i] = x

    return graph

def down(graph) : 
    for i in range(N) :
        # κ°€μž₯ μ•„λž˜ ν–‰
        p = N - 1
        x = 0
        for j in range(N - 1, -1 , -1) :
            # 빈칸
            if graph[j][i] == 0 :
                continue
            # λ”ν• κ²Œ μ—†λ‹€λ©΄
            if x == 0 :
                x = graph[j][i]
            # λ”ν• κ²Œ μžˆλŠ”λ°, μˆ«μžκ°€ 같은가?
            else :
                if x == graph[j][i] :
                    graph[p][i] = x * 2
                    x = 0
                    p -= 1
                else :
                    graph[p][i] = x
                    x = graph[j][i]
                    p -= 1
            # λΉ„μ›Œμ£ΌκΈ°
            graph[j][i] = 0

        # μ•„λž˜μΈ‘μ—μ„œ μœ„μΈ‘ λκΉŒμ§€ 도달!
        if x != 0 :
            graph[p][i] = x

    return graph

def solution(graph, cnt) :
    global result

    if cnt == 5 :
        for i in range(N) :
            for j in range(N) :
                result = max(result, graph[i][j])
        return
    
    solution(left(deepcopy(graph)), cnt + 1)
    solution(right(deepcopy(graph)), cnt + 1)
    solution(up(deepcopy(graph)), cnt + 1)
    solution(down(deepcopy(graph)), cnt + 1)

solution(graph, 0)
print(result)

# input
# 3
# 2 2 2
# 4 4 4
# 8 8 8 

# output
# 16
 
728x90
λ°˜μ‘ν˜•