[백준] 17143번 낚시왕 _ 문제 풀이



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)