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
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 - 2559번] 파이썬 - 수열 (1) | 2024.04.28 |
---|---|
[코드트리] 파이썬 - 고대 문명 유적 탐사 (1) | 2024.04.20 |
[코드트리] 파이썬 - 정육면체 한번 더 굴리기 (2) | 2024.04.12 |
[코드트리] 파이썬 - 팩맨 (0) | 2024.04.12 |
[코드트리] 파이썬 - 루돌프의 반란 (0) | 2024.04.07 |