[Python] BOJ 21610 - 마법사 상어와 비바라기
728x90
반응형
https://www.acmicpc.net/problem/21610
# 2021상반기 삼성SW 기출문제이다.
# 청소년 상어와 마찬가지로 '삼성'스러운 문제이다. 단순구현, 시뮬레이션으로 쉽게 풀수 있다.
1. 처음 비바라기 마법을 시전하면 구름이 (N-2, 0), (N-1, 0), (N-2, 1), (N-1, 1)에 생기고
d방향으로 s만큼 이동한다. 그 뒤 1 ~ 5단계까지 이동명령을 따르는 것을 구현하고
새로운 구름 cloud를 return해준다.
2. 1번 과정을 M번 실행한 뒤 맵 전체에 있는 물의 양을 합해서 출력해주면 된다.
import sys
input = sys.stdin.readline
N, M = map(int,input().split())
dx, dy = [0, -1, -1, -1, 0, 1, 1, 1], [-1, -1, 0, 1, 1, 1, 0, -1]
m = [list(map(int,input().split())) for _ in range(N)]
# 물복사버그 함수: 대각선 방향으로 맵을 벗어나지 않는 칸에 물이 존재하면 cnt 1증가
def check(i, j):
cnt = 0
if 0 <= i-1 < N and 0 <= j-1 < N and m[i-1][j-1]:
cnt += 1
if 0 <= i-1 < N and 0 <= j+1 < N and m[i-1][j+1]:
cnt += 1
if 0 <= i+1 < N and 0 <= j-1 < N and m[i+1][j-1]:
cnt += 1
if 0 <= i+1 < N and 0 <= j+1 < N and m[i+1][j+1]:
cnt += 1
return cnt
def move(d, s, cloud):
clouds = []
if cloud == -1:
cloud = [[N-2, 0], [N-1, 0], [N-1, 1], [N-2, 1]]
# 1단계: 모든 구름이 d방향으로 s칸 이동한다
for i, j in cloud:
nx, ny = (i + dx[d] * s) % N, (j + dy[d] * s) % N
clouds.append((nx, ny))
# 2단계: 각 구름에서 비가 내려 구름이 있는 칸 1증가
for i, j in clouds:
m[i][j] += 1
# 3,4단계: 구름이 사라지고 물이 증가한 칸에서 물복사버그 마법을 시전한다.
for i, j in clouds:
m[i][j] += check(i, j)
# 5단계: m에서 물의 양이 2이상인 모든칸을 cloud에 넣어주고, 물의 양 2줄어든다.
cloud = []
for i in range(N):
for j in range(N):
# 이때 구름이 생기는 칸은 3단계에서 사라진 칸이 아니어야 한다.
if (i, j) not in clouds and m[i][j] >= 2:
cloud.append((i, j))
m[i][j] -= 2
return cloud
cloud = -1
for _ in range(M):
d, s = map(int,input().split())
cloud = move(d-1, s, cloud)
# M번의 이동이 모두 끝난 후 바구니에 들어있는 물의 양의 합 = answer
answer = 0
for i in range(N):
for j in range(N):
answer += m[i][j]
print(answer)
(solved.ac 티어: 골드 5)
728x90
반응형
'문제풀이 > BaekjoonOnlineJudge' 카테고리의 다른 글
[Python] BOJ 2564 - 경비원 (0) | 2021.10.01 |
---|---|
[Python] BOJ 14725 - 개미굴 (0) | 2021.09.29 |
[Python] BOJ 17390 - 이건 꼭 풀어야 해! (0) | 2021.09.26 |
[Python] BOJ 16571 - 알파 틱택토 (1) | 2021.09.25 |
[Python] BOJ 15998 - 카카오머니 (0) | 2021.09.23 |
TAGS.