이번 문제는 삼성 기출 문제로, 시뮬레이션을 구현해야 했다. 시뮬레이션을 쉽게 구현하기 위해 모듈화를 적용하며 풀이했다. 처음에 풀이를 했을 때에는 테스트 케이스의 값들은 잘 나왔지만, 시간초과가 발생하였다. 그래서 변수들의 범위를 확인해보았고, s의 범위가 1000이라는 것을 보고 이를 해결하기 위한 방법을 생각하였다. 만약 범위를 넘어가면 첫번째 인덱스부터 다시 시작하는 방식이었다면 %r과 %c를 한 값을 사용하면 됐지만, 이 문제는 다시 돌아가는 방식이기 때문에 고민을 많이 하였다. 결론적으로는 %(r-1)*2와 %(c-1)*2를 적용하면 범위를 넘었을 때 방향을 틀어 움직이는 것까지 캐치할 수 있었다. 이 방식을 적용하여 다음과 같은 함수들을 작성하였다.
r, c, m=map(int, input().split())
grid=[[-1 for _ in range(c)] for _ in range(r)]
shark=[]
for i in range(m):
y, x, s, d, z=map(int, input().split())
grid[y-1][x-1]=i
if d<=2:
s%=(r-1)*2
else:
s%=(c-1)*2
shark.append([s, d-1, z])
dy, dx=[-1, 1, 0, 0], [0, 0, 1, -1]
cur=-1
answer=0
def move_shark():
tmp=[[-1 for _ in range(c)] for _ in range(r)]
for i in range(r):
for j in range(c):
if grid[i][j]!=-1:
cnt=0
ny, nx=i, j
while cnt<shark[grid[i][j]][0]:
cnt+=1
ny, nx=ny+dy[shark[grid[i][j]][1]], nx+dx[shark[grid[i][j]][1]]
if 0<=ny<r and 0<=nx<c:
continue
else:
if shark[grid[i][j]][1]%2==0:
shark[grid[i][j]][1]+=1
else:
shark[grid[i][j]][1]-=1
ny, nx=ny+2*dy[shark[grid[i][j]][1]], nx+2*dx[shark[grid[i][j]][1]]
if tmp[ny][nx]!=-1:
if shark[tmp[ny][nx]][2]<shark[grid[i][j]][2]:
tmp[ny][nx]=grid[i][j]
else:
tmp[ny][nx]=grid[i][j]
for i in range(r):
for j in range(c):
grid[i][j]=tmp[i][j]
def move_fisher():
global cur
cur+=1
def fishing():
global answer
for i in range(r):
if grid[i][cur]!=-1:
answer+=shark[grid[i][cur]][2]
grid[i][cur]=-1
break
while True:
move_fisher()
if cur==c:
break
fishing()
move_shark()
print(answer)