(재) 17143번 - 낚시왕
2023. 3. 27. 17:32ㆍ2023/BaekHoon_알고리즘
작년에 풀고 다시 한번 풀어봤는데... 로직도 다르고 훨씬 많이 줄어들었다!
그때는 왜 지금처럼 생각 못했을까나...!

# 낚시왕 오른쪽으로 한 칸 이동
# 상어중 가장 땅과 가까운 상어 잡음 (격자판에서 상어 사라짐)
# 상어 이동 - 격자판의 경계를 넘는 경우 방향을 바꿔 이동
# 상어가 두마리 이상 있을수 있는데 큰 상어가 나머지 상어를 모두 잡아먹음
def move(graph, R, C):
dir = [0, [-1, 0], [1, 0], [0, 1], [0, -1]]
newGraph = [[0]*(C+1) for _ in range(R+1)] # 상어 이동후 그래프
for i in range(1, R+1):
for j in range(1, C+1):
if graph[i][j] != 0:
s, d, z = graph[i][j][0], graph[i][j][1], graph[i][j][2]
changedS = s
ni = i; nj = j
while changedS: # 상어의 초당 움직임이 종료 될 때까지
ni += dir[d][0]; nj += dir[d][1]
if ni<1 or ni>R or nj<1 or nj>C: # 방향 전환
if d == 1: d =2
elif d == 2: d=1
elif d == 3: d=4
elif d == 4: d=3
ni += dir[d][0] # 경계선 넘은 경우 복구
nj += dir[d][1]
else:
changedS-=1 # 경계선 넘은 경우 카운팅 제외
if newGraph[ni][nj] != 0:
if newGraph[ni][nj][2] < z: # 이동한 상어자리에 다른 상어가 있는 경우
newGraph[ni][nj] = [s, d, z]
else:
newGraph[ni][nj] = [s, d, z]
return newGraph
R, C, M = map(int, input().split())
# R = 4; C = 6; M = 8
#
graph = [[0]*(C+1) for _ in range(R+1)]
for _ in range(M):
# [ 위치 r, 위치 c, 속력 s, 이동방향 d, 크기 z]
# d = 1(위), 2(아래), 3(오른쪽), 4(왼쪽)
r, c, s, d, z = map(int, input().split())
graph[r][c] = [s, d, z]
loc = 0 # 낚시꾼의 위치
answer = 0
while loc < C:
loc += 1 # 1. 낚시왕 이동
for i in range(1, R+1): # 2. 상어 잡기
if graph[i][loc] != 0:
answer += graph[i][loc][2]
graph[i][loc] = 0
break
graph = move(graph, R, C) # 3. 상어 이동
print(answer)