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 |