본문 바로가기
문제 해결/BOJ

[백준] 낚시왕

by 자잘 2023. 2. 3.

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

 

17143번: 낚시왕

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

www.acmicpc.net

삼성 기출 문제의 경우 설계를 잘해야하는데 심신미약 상태에서 푸느라 설계부터 꼬여서 고생을 많이한 문제입니다. 

포인트가 되는 부분은 상어의 다음 위치를 가져오는 next_pos 함수입니다. 핵심 포인트는 행이 1, R, 열이 1, C를 벗어나게 됐을 때 얼마나 벗어났는지 계산하여 반영해주어야하는게 포인트입니다. 왼쪽으로 향하다가 벗어나서 오른쪽으로 방향 전환하여 진행해도 격자를 벗어나는 경우들이 있어서 계산을 잘해주어야합니다. 

 

# 문제링크: https://www.acmicpc.net/problem/17143

import sys
input = sys.stdin.readline

R, C, M = tuple(map(int, input().split()))

sharks = [
    tuple(map(int, input().split()))
    for _ in range(M)
]

# -2는 의미 없는 값, 위, 아래, 오른, 왼
dys = [-2, -1, 1, 0, 0]
dxs = [-2, 0, 0, 1, -1]

board = [
    [None] * (C + 1)
    for _ in range(R + 1)
]

fishing_king = -1

def next_pos(cur_r, cur_c, d, s):
    nr = cur_r + s * dys[d]


    # 행이 범위를 벗어난 경우
    while nr <= 0 or nr > R:
        if nr <= 0:
            nr = 1 + (1 - nr)
            d = 2
        else:
            nr = R - (nr - R)
            d = 1

    nc = cur_c + s * dxs[d]

    # 열이 범위를 벗어난 경우
    while nc <= 0 or nc > C:
        if nc <= 0:
            nc = 1 + (1 - nc)
            d = 3
        else:
            nc = C - (nc - C)
            d = 4
    return [nr, nc, d]



def move_sharks():
    global R, C

    # 움직인 상어의 위치를 저장하는 2차원 배열
    temp = [
        [None] * (C + 1)
        for _ in range(R + 1)
    ]

    # r 행, c 열, s 속력, d 이동방향, z 크기
    for r, c, s, d, z in sharks:
        board[r][c] = None
        nr, nc, nd = next_pos(r, c, d, s)

        # 상어가 존재하는 경우 대소 비교를 해준다.
        if temp[nr][nc] is not None:
            if z < temp[nr][nc][4]:
                continue

        temp[nr][nc] = (nr, nc, s, nd, z)
    
    # 다 움직인 상어들을 board에 배치하는 과정
    for i in range(1, R + 1):
        for j in range(1, C + 1):
            board[i][j] = temp[i][j]

answer = 0

def hunt_shark(col):
    # 현재 열에서 가장 가까운 위치에 존재하는 상어를 잡는다.
    for i in range(1, R + 1):
        if board[i][col] is not None:
            size = board[i][col][4]
            board[i][col] = None
            return size
    return 0


def update_sharks():
    global sharks

    sharks = []
    # board를 탐색하면서 상어가 있는 경우 상어 리스트에 넣어준다.
    for i in range(1, R + 1):
        for j in range(1, C + 1):
            if board[i][j] is not None:
                sharks.append(board[i][j])

# 초기 세팅
for r, c, s, d, z in sharks:
    board[r][c] = (r, c, s, d, z)

for fishing_king in range(1, C + 1):
    # 가까운 상어를 잡는다.
    answer += hunt_shark(fishing_king)
    # 상어 리스트 업데이트
    update_sharks()
    # 상어를 움직인다.
    move_sharks()

print(answer)

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 군사 이동  (0) 2023.02.05
[백준] 트리의 지름  (0) 2023.02.04
[백준] 물대기  (0) 2023.02.03
[BOJ] 일요일 아침의 데이트  (0) 2023.02.02
[백준] 10986번 나머지 합 - python  (1) 2022.09.29