❓ 문제 - 백준 마법사 상어와 파이어볼 20056번 - python 풀이법
출처
(https://www.acmicpc.net/problem/20056)
📝 문제해결법
1. 이 문제는 구현으로 풀었다.
- board에 현재 파이어볼에 행과 열에 해당하는 정보(질량, 속력, 방향)을 저장한다.
- move() 함수를 활용하여 k만큼 파이어볼을 이동시킨다.
- board에 현재 남아있는 파이어볼의 질량합을 구해 출력한다.
2. move()
- 파이어볼이 이동할 때 모든 파이어볼의 위치가 변경되므로 새로운 b 이중리스트를 이용하여 파이어볼 이동에 사용한다.
- 현재 board에 파이어볼이 존재한다면, 해당 위치에서 방향으로 속력만큼 이동시켜 파이어볼을 위치시킨다.
- b 이중리스트에 파이어볼이 2개 이상이라면 파이어볼을 합쳐야 한다. 파이어볼의 질량 합, 파이어 볼의 속력 합, 모두 홀수인지, 짝수인지를 구한다.
- 만약 파이어볼의 합친 질량이 5 미만이라면 4개로 나누어질 때 질량이 모두 0 이하가 가 되므로 해당 파이어볼을 제거한다.
- 만약 파이어볼의 합친 질량이 5 이상이라면 모두 방향이 홀수이거나, 모두 방향이 짝수일 때 방향을 0,2,4,6, 그외는 1, 3, 5, 7으로 해서 해당 행과 열에 파이어볼을 4개로 나눈 정보를 저장한다.
3. 문제 풀면서 느낀점
- 1번 행과 N번 행, 1번 열과 N번 열이 이어져 있으므로 이동 처리할 때 이동 후 칸 수 % N로 처리해야한다.
💻 소스코드
n, m, k = map(int, input().split())
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, 1, 1, 1, 0, -1, -1, -1]
board = [[[] for _ in range(n)] for _ in range(n)]
for i in range(m):
r, c, mm, s, d = map(int, input().split())
board[r-1][c-1].append([mm, s, d])
def move():
b = [[[] for _ in range(n)] for _ in range(n)]
for i in range(n):
for j in range(n):
if len(board[i][j]) == 0:
continue
for p in board[i][j]:
x, y = i, j
mm, s, d = p
nx = (x + dx[d]*s) % n
ny = (y + dy[d]*s) % n
b[nx][ny].append([mm, s, d])
for i in range(n):
for j in range(n):
if len(b[i][j]) <= 1:
continue
mm_sum, s_sum, a_odd, a_even = 0, 0, True, True
num = len(b[i][j])
for p in b[i][j]:
mm, s, d = p
mm_sum += mm
s_sum += s
# 홀수
if (d%2 == 1):
a_even = False
else:
a_odd = False
b[i][j] = []
if mm_sum < 5:
continue
else:
if a_odd or a_even:
for q in [0, 2, 4, 6]:
b[i][j].append([mm_sum//5, s_sum//num, q])
else:
for q in [1, 3, 5, 7]:
b[i][j].append([mm_sum//5, s_sum//num, q])
for i in range(n):
for j in range(n):
board[i][j] = b[i][j]
for _ in range(k):
move()
answer = 0
for i in range(n):
for j in range(n):
for b in board[i][j]:
answer += b[0]
print(answer)
'알고리즘 > 알고리즘문풀' 카테고리의 다른 글
BOJ - 마법사 상어와 파이어스톰 20058번 (python) (0) | 2021.10.21 |
---|---|
BOJ - 마법사 상어와 토네이도 20057번 (python) (0) | 2021.10.21 |
BOJ - 컨베이어 벨트 위의 로봇 20055번 (python) (0) | 2021.10.20 |
BOJ - 스타트택시 19238번 (python) (0) | 2021.10.20 |
BOJ - 어른 상어 19237번 (python) (0) | 2021.10.20 |