[백준 삼성기출 O] 마법사 상어와 비바라기(python)

이진규·2022년 10월 8일
1

백준(PYTHON)

목록 보기
92/115

문제

https://www.acmicpc.net/problem/21610

나의 코드

"""

"""

N, M = map(int, input().split()) # N:격자판크기, M:구름이 이동 횟수
pan = [ list(map(int, input().split())) for _ in range(N) ]
cloud_dir = [ list(map(int, input().split())) for _ in range(M) ] # 구름 이동 목록

# 비구름 생성
cloud = [ [0] * N for _ in range(N) ]
for i in range(N-2, N):
    cloud[i][0] = 1
    cloud[i][1] = 1

dx = [0, -1, -1, -1, 0, 1, 1, 1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]
def move_cloud(d, s):

    cloud_make = []
    # 1. 모든 구름이 d 방향으로 s칸 이동한다.
    for i in range(N):
        for j in range(N):
            if cloud[i][j] == 1:
                mx = i + (dx[d] * s)
                my = j + (dy[d] * s)

                if not (0 <= mx < N and 0 <= my < N):
                    mx = mx % N
                    my = my % N

                cloud_make.append((mx, my)) # 비구름을 만들 목록
                cloud[i][j] = 0 # 현재 위치의 비구름은 초기화

    for x, y in cloud_make:
        cloud[x][y] = 1
        

    # 2. 각 구름에서 비가 내려 구름이 있는 칸의 바구니에 저장된 물의 양이 1 증가한다.
    for i in range(N):
        for j in range(N):
            if cloud[i][j] == 1:
                pan[i][j] += 1

    # 3. 대각선 방향에 물이 있는 바구니 수만큼 물의 양을 증가시켜주기
    for i in range(N):
        for j in range(N):
            if cloud[i][j] == 1:
                bucket_cnt = 0
                for k in range(1, 8, 2):
                    mx = i + dx[k]
                    my = j + dy[k]

                    if not (0 <= mx < N and 0 <= my < N):
                        continue

                    if pan[mx][my] > 0:
                        bucket_cnt += 1

                pan[i][j] += bucket_cnt

    """ 4. 구름이 있었던 칸을 제외한 나머지 칸 중에서 물의 양이 2 이상인 칸에 구름이 생긴다. 구름이 생기면 물의 양이 2만큼 줄어든다.
    기존에 구름이 있었던 곳의 구름은 사라진다. """
    for i in range(N):
        for j in range(N):
            if cloud[i][j] == 0 and pan[i][j] >= 2: # 구름이 없었고 물의 양이 2 이상이라면, 구름을 생성하고 물의 양을 2 줄인다.
                cloud[i][j] = 1
                pan[i][j] -= 2
            elif cloud[i][j] == 1: # 기존에 구름이 있었던 곳은 구름을 사라지게 한다.
                cloud[i][j] = 0

for d, s in cloud_dir:
    move_cloud(d-1, s)

print(sum( [ sum(x) for x in pan ] ))

    

설명

문제 설명대로 단순 구현하면 쉽게 풀 수 있는 문제

참고 자료

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글