[백준]21610(파이썬) - 마법사 상어와 비바라기

resilient

·

2021. 12. 31. 02:02

728x90
반응형

www.acmicpc.net/problem/21610

 

21610번: 마법사 상어와 비바라기

마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기

www.acmicpc.net

 

  • 이 문제는 2021 삼성 하반기 코딩테스트 문제입니다.
  • 삼성 코딩테스트의 특징대로, 하나하나씩 주어진 조건에 따라서 구현을 해봤습니다.
  • 이 문제에서 가장 오래 걸렸던 부분은 구름위치인 4칸을 각각 대각선 방향으로 옮길 때 어떻게 연결할 것인가 였습니다. 주어진 5 * 5 격자에서 여러 번 손으로 써보니까 규칙이 나왔고, 식을 구해서 대입했습니다. 아마도 다른 분들도 이 부분이 가장 까다롭지 않았나 싶습니다.
  • 나머지는 조건에 따라 순서대로 구현하였고 자세한 조건 순서 및 구현 설명은 주석에 담았습니다.

 

import sys
input = sys.stdin.readline

n,m = map(int,input().split())
A = [list(map(int,input().split())) for i in range(n)]
move_list = []
for i in range(m):
    temp = list(map(int,input().split()))
    move_list.append([temp[0]-1,temp[1]])

clouds = [[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]
for i in range(m):
    x,y = move_list[i]
    #1.이동한구름위치
    nextcloud = []
    for cloud in clouds:
        nx = (cloud[0] + dx[x] * y) % n
        ny = (cloud[1] + dy[x ]* y) % n 
        nextcloud.append([nx,ny])
    #방문처리 
    visited = [[0]*n for _ in range(n)]
    for cloud in nextcloud:
        # 지금 칸에 비를 뿌린다.
        A[cloud[0]][cloud[1]] += 1
        visited[cloud[0]][cloud[1]] = 1
    #3.구름이 모두사라진다
    clouds = []

    # 물복사버그 대각선으로 퍼진다
    dx2 = [-1,-1,1,1]
    dy2 = [-1,1,-1,1]
    for _x,_y in nextcloud:
        cnt = 0
        for i in range(4):
            nx = _x+ dx2[i]
            ny = _y+ dy2[i]
            if 0<= nx <n and 0<= ny <n and A[nx][ny]: # 물이 있을 때
                cnt += 1
        A[_x][_y] += cnt
    # 4. 바구니에 저장된 물의 양이 2 이상인 모든 칸에 구름이 생기고, 물의 양이 2 줄어든다. 이때 구름이 생기는 칸은 3에서 구름이 사라진 칸이 아니어야 한다.
    for i in range(n):
        for j in range(n):
            if A[i][j] >= 2 and visited[i][j] == 0:
                A[i][j] -= 2
                clouds.append([i,j])
total = 0
for i in range(n):
    total += sum(A[i])
print(total)

 

반응형