# 낚시왕
import copy
import sys
input = sys.stdin.readline
N, M, S = map(int, input().split())
arr = [[0] * (M+1) for _ in range(N+1)]
for _ in range(S):
n, m, speed, direction, big = map(int, input().split())
arr[n][m] = (speed, direction, big)
shark_move = [[], [-1, 0], [1, 0], [0, 1], [0, -1]]
def fishing(now):
global result
for i in range(1, N+1):
if arr[i][now] != 0:
result += arr[i][now][2]
arr[i][now] = 0
break
def move_shark():
global arr
temp = [[0]*(M+1)for _ in range(N+1)]
for i in range(1, N+1):
for j in range(1, M+1):
if arr[i][j] != 0:
speed, dir, big = arr[i][j]
n, m, dir = moveOne(i, j, speed, dir)
if temp[n][m] == 0:
temp[n][m] = (speed, dir, big)
else:
if temp[n][m][2] < arr[i][j][2]:
temp[n][m] = (speed, dir, big)
arr = copy.deepcopy(temp)
def moveOne(i, j, speed, dir):
if dir == 1 or dir == 2:
speed = speed % ((N-1)*2)
else:
speed = speed % ((M-1)*2)
n, m = i, j
for _ in range(speed):
n += shark_move[dir][0]
m += shark_move[dir][1]
if 0 < n <= N and 0 < m <= M:
continue
else:
n -= shark_move[dir][0]
m -= shark_move[dir][1]
dir = change_dir(dir)
n += shark_move[dir][0]
m += shark_move[dir][1]
return n, m, dir
def change_dir(dir):
if dir == 1:
return 2
elif dir == 2:
return 1
elif dir == 3:
return 4
else:
return 3
result = 0
for i in range(1, M+1):
fishing(i)
move_shark()
print(result)
구현
1. 상어의 정보를 2차원배열에 입력을 받는다
2. M만큼 반복
- 낚시 (fisihing) : 해당 열에서 가장 가까운 상어의 크기를 result에 더해주고 삭제
- 상어 이동 (move_shark) : 상어를 각각 이동(moveOne)을 해준다. 그 값을 temp에 넣고 arr에 deepcopy해준다
- 상어 한마리 이동 (moveOne) : 한상어를 speed만큼 이동해준다. 끝에 다다르면 방향을 전환(change_dir)
- 방향 전환 (change_dir) : 현재 방향의 반대방향을 반환
3. result 출력
복잡해서 함수를 여러개로 나눠서 풀었다.
최근에 JavaScript프로젝트 하나 했다고 풀고나니 함수 이름이 moveOne이다.
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 13460번 - 구슬 탈출 2 (파이썬) (0) | 2022.02.11 |
---|---|
[백준] 13459번 - 구슬 탈출 (파이썬) (0) | 2022.02.11 |
[백준] 1043번 - 거짓말 (파이썬) (0) | 2022.02.09 |
[백준] 1865번 - 웜홀 (파이썬) (0) | 2022.02.09 |
[백준] 1525번 - 퍼즐 (파이썬) (1) | 2022.02.09 |