코딩 공부

[Python](시뮬) 백준 21610번 : 마법사 상어와 비바라기 본문

삼성 SW 역량 테스트 기출 문제

[Python](시뮬) 백준 21610번 : 마법사 상어와 비바라기

Algomalgo 2024. 1. 29. 20:49
728x90


<접근 방법>

  1. 시뮬레이션 유형이므로 문제에 나와있는 과정 그대로 코드를 구상하도록 한다.
  2. 끝과 끝이 이어진 격자임을 고려하여 [1]번 과정에서 이동된 구름의 위치i, j를 각각 N으로 나눠준다.
  3. [2]번 과정에서는 위에서 구한 이동된 구름(new_cloud)의 위치에 비의 양을 +1 해준다.
  4. [3]번 과정(구름 사라짐)은 따로 구현할 것은 없고, 이후 과정에서 구름의 위치들이 사용되므로 지우지 않음에 유의한다.
  5. [4]번 과정에서는 각 구름 좌표의 대각선에 물이 들어있는 바구니 수(count)를 세야하므로 ↖,↗,↙,↘ 방향의 물 존재 여부를 카운트하여 각 좌표의 물의 양에 값을 물이 들어있는 바구니 수를 더해준다.
  6. [5]번 과정에서 구름을 새로 생성해야 하므로 좌표의 값이 2이상(arr[i][j]>=2), 좌표가 new_cloud에 속해있지 않은 좌표들을 cloud라는 새로운 리스트에 저장하고, 그 좌표의 값을 -2 해준다.
  7. M번의 명령 이후, 모든 좌표의 값을 더해 answer을 구해준다.
N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
directions = {1:(0, -1), 2:(-1, -1), 3:(-1, 0), 4:(-1, 1), 5:(0, 1), 6:(1, 1), 7:(1, 0), 8:(1, -1)}
cloud = [(N-1, 0), (N-1, 1), (N-2, 0), (N-2, 1)]

for _ in range(M):
    # [1] 모든 구름이 di방향으로 si칸 이동한다.
    di, si = map(int, input().split())
    new_cloud = set()
    for ci, cj in cloud:
        ni = (ci + si*directions[di][0])%N
        nj = (cj + si*directions[di][1])%N
        new_cloud.add((ni, nj))

    # [2] 구름이 있는 칸의 바구니에 저장된 물의 양이 1 증가
    for ci, cj in new_cloud:
        arr[ci][cj] += 1

    # [3] 구름 사라짐

    # [4] 물 증가 칸에 물복사버그 마법(대각선 구름 존재 여부 수)
    for ci, cj in new_cloud:
        count = 0
        for di, dj in ((-1, -1), (-1, 1), (1, -1), (1, 1)):
            ni = ci + di
            nj = cj + dj
            if 0<=ni<N and 0<=nj<N and arr[ni][nj]:
                count += 1
        arr[ci][cj] += count

    # [5] 구름 생성
    cloud = []
    for i in range(N):
        for j in range(N):
            if arr[i][j] >= 2 and (i, j) not in new_cloud:
                cloud.append((i, j))
                arr[i][j] -= 2

answer = 0
for i in arr:
    answer += sum(i)
print(answer)

예제 2의 명령 과정
예제 2의 명령 과정

이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.

728x90