728x90

코드트리 - 나무 타이쿤

 

소요 시간 : 30분

# 접근 방법

  • 구현, 시뮬레이션 유형 중 기본적인 문제라고 생각한다.
  • 문제에서의 핵심은 영양제가 이동할 때 격자가 이어진다는 점(0과 N-1)과 주어지는 이동 칸 수를 N으로 나눈 나머지로 변경해주는 것이라 생각한다.
  • 주어지는 로직 대로 아래 함수들을 사용하여 풀었다.
  • move_m(d, al)
    • 이동시킨 위치를 기록한 temp 빈 리스트를 생성해주고 loc_m을 순회해준다.
    • 영양제의 다음 위치는 (전체 길이 N + 현재 위치 + 이동할 방향 * 칸수를 더한 뒤 N으로 나눈 나머지)로 구해주었다.
    • temp에 append 해준 후 모든 순회가 끝나면 temp를 리턴해준다.
  • grow_l(temp)
    • 위 함수에서 return 받은 이동 후의 위치를 순회하며 먼저 +1씩 성장시켜준다.
    • 이후 temp를 한번더 순회하며 4방향을 체크하여 1이상의 값이 있다면 cnt +1을 해주고
    • 전체 cnt만큼 해당 칸을 성장시킨다.
    • 여기서는 격자를 벗어나면 안되는 것을 까먹지말자!
  • make_m(already)
    • 전체 arr을 순회하며 already(이전에 성장시킨 칸)에 포함되어 있지않고 2 이상인 곳을 -2 한 후 temp에 넣어준다.
  • loc_m을 make_m에서 return 받은 값으로 deepcopy해주면 끝이다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from copy import deepcopy

def move_m(d, al):
    global N, loc_m
    temp = []
    for mi, mj in loc_m:
        ni, nj = (N+mi+di[d]*al)%N, (N+mj+dj[d]*al)%N
        temp.append([ni, nj])
    return temp

def grow_l(t):
    global arr
    for ti, tj in t:
        arr[ti][tj] += 1

    for ti, tj in t:
        cnt = check_cross(ti, tj)
        arr[ti][tj] += cnt

def check_cross(ci, cj):
    global arr
    c = 0
    for d in [1, 3, 5, 7]:
        ni, nj = ci+di[d], cj+dj[d]
        if 0<=ni<N and 0<=nj<N and arr[ni][nj] >= 1:
            c += 1

    return c

def make_m(t):
    global arr
    temp = []
    for i in range(N):
        for j in range(N):
            if [i, j] not in t and arr[i][j] >= 2:
                arr[i][j] -= 2
                temp.append([i, j])
    return temp

#    오, 오위, 위, 좌위, 좌, 좌하, 하, 우하
di = [0, -1, -1, -1, 0, 1, 1, 1]
dj = [1, 1, 0, -1, -1, -1, 0, 1]

N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
loc_m = [[N-2, 0], [N-1, 0], [N-2, 1], [N-1, 1]]
command = []

for _ in range(M):
    command.append(list(map(int, input().split())))

for ci, cj in command:
    cj %= N
    m_arr = move_m(ci-1, cj)
    grow_l(m_arr)
    new_m = make_m(m_arr)
    loc_m = deepcopy(new_m)

result = 0
for i in range(N):
    result += sum(arr[i])
print(result)
728x90