(재) 17143번 - 낚시왕

2023. 3. 27. 17:322023/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)