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

 

17143번: 낚시왕

낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다.

www.acmicpc.net

접근

따로 복잡한 알고리즘 없이 문제 구현만 하면 되는 문제였다.

낚시꾼이 n번 위치로 이동하여 맨 위에 있는 상어를 잡는 move_fisherman 함수와 상어들이 자신의 이동 속도와 방향으로 이동한 후 가장 큰 상어만 남기는 move_sharks 함수를 만들어 낚시꾼이 이동할 때마다 실행해줌으로써 문제를 해결할 수 있었다.

코드

from copy import deepcopy

R, C, M = map(int, input().split())
matrix = [[0 for _ in range(C)] for __ in range(R)]
bowl = deepcopy(matrix)
for _ in range(M):
    r, c, s, d, z = map(int, input().split())
    bowl[r - 1][c - 1] = (z, s, d - 1)


def move_fisherman(n):
    catch = 0
    for i in range(R):
        if bowl[i][n] and not catch:
            catch = bowl[i][n][0]
            bowl[i][n] = 0
    return catch


def move_sharks(bowl):
    new_bowl = deepcopy(matrix)
    for r in range(R):
        for c in range(C):
            if bowl[r][c]:
                z, s, d = bowl[r][c]
                nr, nc, nd = move_one_shark(r, c, s, d)
                if new_bowl[nr][nc] == 0:
                    new_bowl[nr][nc] = (z, s, nd)
                else:
                    nbz, nbs, nbd = new_bowl[nr][nc]
                    if nbz > z:
                        continue
                    else:
                        new_bowl[nr][nc] = (z, s, nd)
    return new_bowl


def move_one_shark(r, c, s, d):
    if d == 0:
        move_val = s % (2 * (R - 1))
        if 0 <= r - move_val < R:
            r = r - move_val
        elif 0 <= r - move_val + R - 1 < R:
            r = move_val - r
            d = 1
        else:
            r = 2 * (R - 1) + r - move_val
    elif d == 1:
        move_val = s % (2 * (R - 1))
        if 0 <= r + move_val < R:
            r = r + move_val
        elif 0 <= r + move_val - R + 1 < R:
            r = 2 * (R - 1) - move_val - r
            d = 0
        else:
            r = r + move_val - 2 * (R - 1)
    elif d == 2:
        move_val = s % (2 * (C - 1))
        if 0 <= c + move_val < C:
            c = c + move_val
        elif 0 <= c + move_val - C + 1 < C:
            c = 2 * (C - 1) - move_val - c
            d = 3
        else:
            c = c + move_val - 2 * (C - 1)
    elif d == 3:
        move_val = s % (2 * (C - 1))
        if 0 <= c - move_val < C:
            c = c - move_val
        elif 0 <= c - move_val + C - 1 < C:
            c = move_val - c
            d = 2
        else:
            c = 2 * (C - 1) + c - move_val
    return r, c, d


catch_val = 0
for i in range(C):
    catch_val += move_fisherman(i)
    bowl = move_sharks(bowl)
print(catch_val)

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기