백준 - 마법사 상어와 비바라기 / Gold 5 / 21610번 / Python

Ed Park·2023년 3월 20일
0
post-custom-banner

문제 📋

백준 - 마법사 상어와 비바라기


풀이 📝

import sys


def make_in_bound(n, pos):
    if pos < 0:
        return pos + n
    elif pos >= n:
        return pos - n
    else:
        return pos


def solution(n, m, grid, cmd):
    delta = [(0, -1), (-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1)]
    cloud = [[n - 1, 0], [n - 1, 1], [n - 2, 0], [n - 2, 1]]

    for d, s in cmd:
        visited = [[False] * n for _ in range(n)]

        for i in range(len(cloud)):  # 구름 이동 및 비 내리기.
            delta_row, delta_col = delta[d - 1]

            new_row = make_in_bound(n, cloud[i][0] + s * delta_row % n)
            new_col = make_in_bound(n, cloud[i][1] + s * delta_col % n)

            grid[new_row][new_col] += 1
            visited[new_row][new_col] = True
            cloud[i][0] = new_row
            cloud[i][1] = new_col

        while cloud:  # 물 복사 마법.
            cnt = 0
            row, col = cloud.pop()

            for i in range(4):
                delta_row, delta_col = delta[2 * i + 1]
                target_row = row + delta_row
                target_col = col + delta_col

                if 0 <= target_row < n and 0 <= target_col < n:
                    if grid[target_row][target_col] > 0:
                        cnt += 1

            grid[row][col] += cnt

        for i in range(n):  # 새로운 구름 생성.
            for j in range(n):
                if grid[i][j] >= 2 and not visited[i][j]:
                    cloud.append([i, j])
                    grid[i][j] -= 2
    sum_water = 0
    for row in grid:
        sum_water += sum(row)
    return sum_water


n, m = map(int, sys.stdin.readline().split())
grid = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
cmd = [list(map(int, sys.stdin.readline().split())) for _ in range(m)]

print(solution(n, m, grid, cmd))

시키는대로 구현만 하면 되는 구현 문제이다.
하지만 구현해야 할 상황이 조금 복잡하다.
즉, 실수하기 딱 좋다.

따라서 복잡한 구현 문제를 만났을 때
다음번에는 어떻게 행동해야 할지 다음과 같이 정리 해본다.

  1. 요구사항에 나와있는 여러 동작들을 분리하여 각각의 다른 함수로 설계한다.
  2. 함수를 하나씩 개발한 후 예상대로 동작하는지 확인한다. (단위 테스트)
  3. 함수를 전부 개발하면 전체적으로 잘 동작하는지 확인한다. (통합 테스트)
profile
Simple is the best
post-custom-banner

0개의 댓글