반응형
포인트
- 문제는 생각보다 술술 읽히는 문제 입니다.
- 중요한 포인트
- 기존에 구름이 있었던 자리에는 구름이 생길 수 없다
- 이동은 경계에 대한 제약이 없으나 복사 행동은 경계 제약이 있다는 것입니다.
🧶문서는 항상 수정될 수 있습니다. 비판은 환영합니다.
python
n, m = map(int, input().split())
data = [list(map(int, input().split())) for _ in range(n)]
queries = [list(map(int, input().split())) for _ in range(m)]
cloud = [(n-1, 0), (n-1, 1), (n-2, 0), (n-2, 1)]
dx = [0, -1, -1, -1, 0, 1, 1, 1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]
def cloud_act1(d: int, s: int, cloud: list) -> None:
"""구름이 위치한 곳에 물의 양을 1늘려준다. 그리고 물 복사 마법을 수행한다.
Args:
d (int): 방향을 결정해준다.
s (int): 특히나 이어져 있는 구간에서 속력은 유용하게 사용된다.
cloud (list): 클라우드 데이터
"""
for index, (row, col) in enumerate(cloud):
nx = (row + s*dx[d-1]) % n
ny = (col + s*dy[d-1]) % n
data[nx][ny] += 1
cloud[index] = (nx, ny)
for row, col in cloud:
cnt = 0
for cx, cy in [(-1, 1), (1, 1), (1, -1), (-1, -1)]:
nx = row+cx
ny = col+cy
if not(0 <= nx < n and 0 <= ny < n) or not data[nx][ny]:
continue
cnt += 1
data[row][col] += cnt
def cloud_act2(cloud: list) -> list:
""" 물의 양이 2 이고 cloud 에서 없었던 것을 사용한다.
Args:
cloud (list): cloud 데이터
Returns:
list: 업데이트된 클라우드를 반환한다.
"""
cloud2 = []
for row in range(n):
for col in range(n):
if data[row][col] >= 2 and (row, col) not in cloud:
cloud2.append((row, col))
data[row][col] -= 2
return cloud2[::]
for d, s in queries:
cloud_act1(d, s, cloud)
cloud = cloud_act2(cloud)
result = 0
for row in range(n):
for col in range(n):
result += data[row][col]
print(result)
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘] 스타트 택시 (0) | 2021.10.04 |
---|---|
[알고리즘] 실패율 (0) | 2021.09.04 |
[알고리즘] Complex Number Multiplication (0) | 2021.08.24 |
[알고리즘] Valid Sudoku && Sudoku Solver (0) | 2021.08.21 |
[알고리즘] Word Search (0) | 2021.08.15 |
댓글