12100: 2048 (Easy)

ewillwin·2023년 4월 7일
0

Problem Solving (BOJ)

목록 보기
7/230

N = int(input())

block = []
for i in range(N):
    block.append(list(map(int, input().split(' '))))

def cpy_block(src_block):
    dest_block = []
    for i in range(N):
        tmp = []
        for j in range(N):
            tmp.append(src_block[i][j])
        dest_block.append(tmp)
    return dest_block

def move(block, direction):
    if direction == 0: # right
        for i in range(N):
            end = N-1
            for j in range(N-2, -1, -1):
                if block[i][j]:
                    value = block[i][j]
                    block[i][j] = 0
                    if block[i][end] == 0:
                        block[i][end] = value
                    elif block[i][end] == value:
                        block[i][end] = value * 2
                        end -= 1
                    elif block[i][end] != value:
                        end -= 1
                        block[i][end] = value

    elif direction == 1: # left
        for i in range(N):
            end = 0
            for j in range(1, N):
                if block[i][j]:
                    value = block[i][j]
                    block[i][j] = 0
                    if block[i][end] == 0:
                        block[i][end] = value
                    elif block[i][end] == value:
                        block[i][end] = value * 2
                        end += 1
                    elif block[i][end] != value:
                        end += 1
                        block[i][end] = value

    elif direction == 2: # down
        for j in range(N):
            end = N-1
            for i in range(N-2, -1, -1):
                if block[i][j]:
                    value = block[i][j]
                    block[i][j] = 0
                    if block[end][j] == 0:
                        block[end][j] = value
                    elif block[end][j] == value:
                        block[end][j] = value * 2
                        end -= 1
                    elif block[end][j] != value:
                        end -= 1
                        block[end][j] = value

    elif direction == 3: # up
        for j in range(N):
            end = 0
            for i in range(1, N):
                if block[i][j]:
                    value = block[i][j]
                    block[i][j] = 0
                    if block[end][j] == 0:
                        block[end][j] = value
                    elif block[end][j] == value:
                        block[end][j] = value * 2
                        end += 1
                    elif block[end][j] != value:
                        end += 1
                        block[end][j] = value

    return block

def dfs(block, cnt):
    global result
    if cnt == 5:
        for i in range(N):
            for j in range(N):
                result = max(result, block[i][j])
        return
    for i in range(4):
        block_cpyed = cpy_block(block)
        block_moved = move(block_cpyed, i)
        dfs(block_moved, cnt + 1) #recursion을 통한 dfs/ 한 방향 당 탐색 진행

result = 0
dfs(block, 0)
print(result)
  • dfs를 이용해서 left, right, down, up 하는 경우를 각각 탐색함
  • recursion으로 dfs를 구현함
    • 4방향, 총 5번 이동 (4 ^ 5 = 1024의 경우)
    • 모든 방향 탐색을 마친 후 (cnt가 5일 때), block에서 최댓값을 찾아, 전역변수 ans를 max값으로 갱신해줌
  • 각 방향 별로 이동하는 경우를 나누어 move 함수를 구현함
    • 각 방향마다 총 3가지의 경우가 존재함
      1) 맨 끝의 위치가 0인 경우
      2) 맨 끝의 값과 그 전의 값이 같은 경우
      3) 맨 끝의 값과 그 전의 값이 다른 경우
  • aliasing이 아닌, value를 복사해 주기 위해 cpy_block 함수를 구현함
profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글