본문 바로가기
Algorithm/BOJ

[백준] 17143번 - 낚시왕 (파이썬)

by _temp 2022. 2. 11.

https://www.acmicpc.net/problem/17143

# 낚시왕
import copy
import sys
input = sys.stdin.readline

N, M, S = map(int, input().split())
arr = [[0] * (M+1) for _ in range(N+1)]
for _ in range(S):
    n, m, speed, direction, big = map(int, input().split())
    arr[n][m] = (speed, direction, big)
shark_move = [[], [-1, 0], [1, 0], [0, 1], [0, -1]]


def fishing(now):
    global result
    for i in range(1, N+1):
        if arr[i][now] != 0:
            result += arr[i][now][2]
            arr[i][now] = 0
            break


def move_shark():
    global arr
    temp = [[0]*(M+1)for _ in range(N+1)]
    for i in range(1, N+1):
        for j in range(1, M+1):
            if arr[i][j] != 0:
                speed, dir, big = arr[i][j]
                n, m, dir = moveOne(i, j, speed, dir)
                if temp[n][m] == 0:
                    temp[n][m] = (speed, dir, big)
                else:
                    if temp[n][m][2] < arr[i][j][2]:
                        temp[n][m] = (speed, dir, big)
    arr = copy.deepcopy(temp)


def moveOne(i, j, speed, dir):
    if dir == 1 or dir == 2:
        speed = speed % ((N-1)*2)
    else:
        speed = speed % ((M-1)*2)
    n, m = i, j
    for _ in range(speed):
        n += shark_move[dir][0]
        m += shark_move[dir][1]
        if 0 < n <= N and 0 < m <= M:
            continue
        else:
            n -= shark_move[dir][0]
            m -= shark_move[dir][1]
            dir = change_dir(dir)
            n += shark_move[dir][0]
            m += shark_move[dir][1]
    return n, m, dir


def change_dir(dir):
    if dir == 1:
        return 2
    elif dir == 2:
        return 1
    elif dir == 3:
        return 4
    else:
        return 3


result = 0
for i in range(1, M+1):
    fishing(i)
    move_shark()
print(result)

 

구현

1. 상어의 정보를 2차원배열에 입력을 받는다

2. M만큼 반복

    - 낚시 (fisihing) : 해당 열에서 가장 가까운 상어의 크기를 result에 더해주고 삭제

    - 상어 이동 (move_shark) : 상어를 각각 이동(moveOne)을 해준다. 그 값을 temp에 넣고 arr에 deepcopy해준다

    - 상어 한마리 이동 (moveOne) : 한상어를 speed만큼 이동해준다. 끝에 다다르면 방향을 전환(change_dir)

    - 방향 전환 (change_dir) : 현재 방향의 반대방향을 반환

3. result 출력

 

복잡해서 함수를 여러개로 나눠서 풀었다.

최근에 JavaScript프로젝트 하나 했다고 풀고나니 함수 이름이 moveOne이다.