링크 : https://www.acmicpc.net/problem/21610
21610번: 마법사 상어와 비바라기
마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기
www.acmicpc.net
- 문제
- 소요시간: 1시간 40분





- 설계하기(접근방법)
1. 입력받기
2. 구현하기
코드 참고
3. 출력하기
- 코드(출력)
import sys
input = sys.stdin.readline
n, trial = map(int,input().split())
water = [list(map(int, input().split())) for _ in range(n)]
cloud_loc = [[0 for _ in range(n)] for _ in range(n)]
# 첫 구름 생성
cloud_loc[n - 1][0], cloud_loc[n - 1][1], cloud_loc[n - 2][0], cloud_loc[n - 2][1] = 1,1,1,1
# ←, ↖, ↑, ↗, →, ↘, ↓, ↙
dx = [0, -1, -1, -1, 0, 1, 1, 1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]
# 이동시에는 경계를 넘나들 수 있음
def cloud_move(direction, distance):
distance = distance % n
cloud_now = []
# 구름 다음 위치 초기화
for i in range(n):
for j in range(n):
if cloud_loc[i][j] == 1:
# 현재 위치 확보
cloud_now.append([i,j])
new_cloud_loc = []
for i in cloud_now:
x, y = i[0] ,i[1]
nx = x + (dx[direction] * distance)
nx = nx % n
ny = y + (dy[direction] * distance)
ny = ny % n
new_cloud_loc.append([nx, ny])
return new_cloud_loc
for _ in range(trial):
direction, distance = map(int, input().split())
direction -= 1
## 구름 이동
new_cloud_loc = cloud_move(direction, distance)
cloud_loc = [[0 for _ in range(n)] for _ in range(n)]
## 이동된 위치에 비 1씩 증가
for new in new_cloud_loc:
x,y = new
water[x][y] += 1
## 복사 버그
for copy_bug in new_cloud_loc:
x, y = copy_bug
for i in range(1,8,2):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n:
if water[nx][ny] >= 1:
water[x][y] += 1
### 새로운 구름
cloud_loc = [[0 for _ in range(n)] for _ in range(n)]
before_cloud_temp = []
### 이전 구름 생성 위치 0으로 초기화 후 저장
for before in new_cloud_loc:
x,y = before
before_cloud_temp.append([x, y, water[x][y]])
water[x][y] = 0
for i in range(n):
for j in range(n):
if water[i][j] >= 2:
water[i][j] -= 2
cloud_loc[i][j] = 1
## -2 연산 후 이전 구름 위치 복구
for i in range(len(before_cloud_temp)):
x , y, value = before_cloud_temp[i]
water[x][y] = value
### 총합 구하기
total_water = 0
for i in water:
total_water += sum(i)
print(total_water)
- 얻어갈 부분
1. 상당히 까다로운 구현이었다. 독해하기도 쉽지 않았고, 구현 조건과 시간이 넉넉하지 못했다. 그래도 끝까지 푼것에 의의를 두자
2. 경계를 넘나드는 문제의 경우 %로 처리하면 매우 쉽게 처리할 수 있는 것을 배웠다.
'알고리즘(백준) > 구현' 카테고리의 다른 글
| [알고리즘/구현] 14502번 : 연구소 - python (0) | 2024.02.21 |
|---|---|
| [알고리즘/구현] 1475번 : 방 번호 - python (0) | 2024.02.17 |
| [알고리즘/구현] 14891번 : 톱니바퀴 - python (0) | 2024.02.14 |
| [알고리즘/구현] 21608번 : 상어 초등학교 - python (0) | 2024.02.14 |
| [알고리즘/구현] 20055번 : 컨베이어 벨트 위의 로봇 - python (0) | 2024.01.02 |