본문 바로가기
알고리즘

[알고리즘] 마법사 상어와 비바라기

by keel_im 2021. 10. 11.
반응형

포인트

  • 문제는 생각보다 술술 읽히는 문제 입니다. 
  • 중요한 포인트
    • 기존에 구름이 있었던 자리에는 구름이 생길 수 없다
    • 이동은 경계에 대한 제약이 없으나 복사 행동은 경계 제약이 있다는 것입니다.

🧶문서는 항상 수정될 수 있습니다. 비판은 환영합니다.

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

댓글