1. 문제
https://www.acmicpc.net/problem/17143
2. 풀이
삼성 SW 역량테스트 문제입니다. 전반적인 문제 이해는 쉽지만, 물고기의 이동을 구현하는 것이 다소 오래 걸렸습니다. 물고기의 이동을 어떻게 훨씬 더 간단하게 구현할까 생각했지만, 다른 풀이를 봐도 크게 쉽게 풀지는 못한 것 같습니다. 방향에 따라 일일히 구현해주어야 되는 문제인 것으로 보여집니다.
import copy
R, C, M = map(int, input().split())
fisher_c = 0
maps = [[[] for __ in range(C)] for _ in range(R)]
# d가 1인 경우는 위, 2인 경우는 아래, 3인 경우는 오른쪽, 4인 경우는 왼쪽을 의미한다. -> 1씩 빼서 적용
dr = [-1, 1, 0, 0]
dc = [0, 0, 1, -1]
for _ in range(M):
r, c, s, d, z = map(int, input().split())
maps[r - 1][c - 1] = [s, d - 1, z]
def catch_fish():
global catched_size
for r in range(0, R):
if maps[r][fisher_c] == []:
continue
catched_size += maps[r][fisher_c][2]
maps[r][fisher_c] = []
break
def sharks_move():
global maps
copied_maps = [[[] for __ in range(C)] for _ in range(R)]
for r in range(R):
for c in range(C):
if maps[r][c] == []:
continue
s, d, z = maps[r][c]
next_r = r + dr[d] * (s % (2 * R - 2))
next_c = c + dc[d] * (s % (2 * C - 2))
next_d = d
# 범위를 벗어날만큼 많이 이동한다면 이동
if not 0 <= next_r < R:
move_num = s % (2 * R - 2)
now_r = r
while move_num > 0:
if next_d == 0:
if now_r - move_num >= 0:
now_r = now_r - move_num
break
move_num -= now_r
now_r = 0
next_d = 1
elif next_d == 1:
if R - 1 - now_r - move_num >= 0:
now_r = now_r + move_num
break
move_num -= R - 1 - now_r
now_r = R - 1
next_d = 0
next_r = now_r
elif not 0 <= next_c < C:
move_num = s % (2 * C - 2)
now_c = c
while move_num > 0:
if next_d == 3:
if now_c - move_num >= 0:
now_c = now_c - move_num
break
move_num -= now_c
now_c = 0
next_d = 2
elif next_d == 2:
if C - 1 - now_c - move_num >= 0:
now_c = now_c + move_num
break
move_num -= C - 1 - now_c
now_c = C - 1
next_d = 3
next_c = now_c
copied_maps[next_r][next_c].append([s, next_d, z])
for r in range(R):
for c in range(C):
if len(copied_maps[r][c]) >= 1:
copied_maps[r][c] = max(copied_maps[r][c], key=lambda x: x[2])
maps = copy.deepcopy(copied_maps)
catched_size = 0
while fisher_c < C:
catch_fish()
sharks_move()
fisher_c += 1
print(catched_size)