2021_상_P_1_L11

Nitroblue 1·2025년 9월 12일

삼성 기출 풀이

목록 보기
39/73

나무 타이쿤

Simulation

평균 : 170'


sol : 95'

  • 수행 시간 : 130ms
  • 메모리 : 19MB

New Skills

  • 행, 열이 연결된 좌표 이동하기
def next_pos(x, y, d, p):
    nx = (x + dxs[d] * p + n * p) % n
    ny = (y + dys[d] * p + n * p) % n
    return (nx, ny)
n, m = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]
move_info = [list(map(int, input().split())) for _ in range(m)]

directions = {
    1: [0, 1],
    2: [-1, 1],
    3: [-1, 0],
    4: [-1, -1],
    5: [0, -1],
    6: [1, -1],
    7: [1, 0],
    8: [1, 1]
}

def get_tree_sum():
    total = 0
    for i in range(n):
        for j in range(n):
            total += grid[i][j]
    return total


def inbound(i, j):
    if 0 <= i < n and 0 <= j < n:
        return True
    return False


def debug(board):
    for r in board:
        for c in r:
            print(int(c), end=" ")
        print()
    print()


vitamin = [
        [False for _ in range(n)]
        for _ in range(n)
    ]

vitamin[n-2][0], vitamin[n-1][0], vitamin[n-2][1], vitamin[n-1][1] = True, True, True, True

def simulate():
    y = 0
    while y < m:
        move(move_info[y])
        grow()
        buy()
        y += 1

    return get_tree_sum()


def move(m_info):
    global vitamin
    ds = directions.get(m_info[0])
    temp = [
        [False for _ in range(n)]
        for _ in range(n)
    ]

    for i in range(n):
        for j in range(n):
            if vitamin[i][j]:
                ni, nj = get_index(i, j, ds[0], ds[1], m_info[1])
                temp[ni][nj] = True

    vitamin = [row[:] for row in temp]
    return


def get_index(ci, cj, di, dj, d):
    ni = (ci + di * d + n * d) % n
    nj = (cj + dj * d + n * d) % n
    return ni, nj


def grow():
    diagonal = [directions.get(i) for i in range(2, 9, 2)]

    for i in range(n):
        for j in range(n):
            if vitamin[i][j]:
                grid[i][j] += 1

    for i in range(n):
        for j in range(n):
            if vitamin[i][j]:
                for d in diagonal:
                    ni, nj = i + d[0], j + d[1]
                    if inbound(ni, nj) and grid[ni][nj] >= 1:
                        grid[i][j] += 1


def buy():
    global vitamin
    temp = [
        [False for _ in range(n)]
        for _ in range(n)
    ]

    for i in range(n):
        for j in range(n):
            if grid[i][j] >= 2 and not vitamin[i][j]:
                grid[i][j] -= 2
                temp[i][j] = True

    vitamin = [row[:] for row in temp]
############################################################
print(simulate())

0개의 댓글