티스토리 뷰

문제에 주어진 조건에 따라 그대로 구현하는 문제이다. 문제를 크게 두개로 나누면 낚시왕이 이동 후 상어를 낚는 것, 상어가 이동하는 것으로 나눌 수 있다.
낚시왕이 상어를 낚는 것
- 낚시왕은 1초가 지나면 오른쪽으로 이동한다.
- 이동한 열에서 가장 바닦에 가까운 상어를 낚는다.
상어가 이동하는 것
먼저 방향이 1, 2,(상, 하), 3, 4(우 ,좌)인 것을 나누어 생각한다. 그 중 3, 4인 것을 예로 설명 하겠다.
- 현재 위치(열 번호)와 끝 지점간 차이를 구한다. 이때 끝 지점은 방향이 3일 경우 C가 되고 4일 경우는 1이 될 것이다.
- 그 차이가 속도보다 크거나 같은 경우 현재 위치에서 속도를 뺀다. 이는 최대한 도달할 수 있는 지점이 끝 지점이기 때문에 방향을 바꾸어 돌아 오는 것을 생각하지 않아도 되기 때문이다.
- 그 차이가 속도보다 작은 경우 상어를 끝지점으로 이동시키고 방향을 전환한다. 속도에서 차이 값을 뺀 후 다시 1번부터 반복한다.
Python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from sys import stdin | |
readline = stdin.readline | |
R, C, M = map(int, readline().split()) | |
_map = [[[] for _ in range(C+1)] for _ in range(R+1)] | |
for _ in range(M): | |
r, c, s, d, z = map(int, readline().split()) | |
_map[r][c] = [s, d, z] | |
def solve(): | |
ans = 0 | |
for col in range(1, C+1): | |
# 같은 열에 있는 상어 잡기 | |
for row in range(1, R+1): | |
if _map[row][col]: | |
ans += _map[row][col][2] | |
_map[row][col] = [] # 상어를 잡은 후 _map에서 제거 | |
break | |
# 상어 이동 | |
move_result = [] | |
for row in range(1, R+1): | |
for col in range(1, C+1): | |
if _map[row][col]: | |
move_result.append(move(row, col)) | |
# 해당 열에 상어가 있을 경우 크기가 큰 상어가 작은 상어를 잡아 먹는다. | |
for res in move_result: | |
if _map[res[0]][res[1]]: | |
# 큰 상어가 작은 상어를 잡아 먹는다. | |
if res[2][-1] > _map[res[0]][res[1]][-1]: | |
_map[res[0]][res[1]] = res[2] | |
else: | |
# 상어가 없을 경우 위치 시킨다. | |
_map[res[0]][res[1]] = res[2] | |
print(ans) | |
def move(row, col): | |
s, d, z = _map[row][col] | |
r, c = row, col | |
if d == 1 or d == 2: | |
while s > 0: | |
diff = 0 | |
if d == 1: | |
diff = abs(r - 1) | |
else: | |
diff = abs(r - R) | |
if diff >= s: | |
if d == 1: | |
r -= s | |
else: | |
r += s | |
break | |
else: | |
if d == 1: | |
r = 1 | |
d = 2 | |
else: | |
r = R | |
d = 1 | |
s -= diff | |
else: | |
while s > 0: | |
diff = 0 | |
# 현재 위치와 끝 지점간 차이를 구한다. | |
if d == 4: | |
diff = abs(c - 1) | |
else: | |
diff = abs(c - C) | |
# 차이가 속도보다 크거나 같은 경우 | |
# 최대 이동할 수 있는 지점이 끝 지점이기 때문에 | |
# 현재 위치에서 속도를 뺀 후 이동을 종료한다. | |
if diff >= s: | |
if d == 4: | |
c -= s | |
else: | |
c += s | |
break # 반드시 작성 | |
else: | |
# 차이가 속도보다 작은 경우 | |
# 상어를 끝지점으로 이동 시킨 후 방향을 전환한다. | |
if d == 4: | |
c = 1 | |
d = 3 | |
else: | |
c = C | |
d = 4 | |
# 방향 전환 후 다시 남은 거리만큼 이동하기위해 | |
# 속도에서 차이를 뺀 후 | |
# 처음부터 다시 반복한다. | |
s -= diff | |
# 상어의 수정된 방향을 반영한다. | |
_map[row][col][1] = d | |
temp = _map[row][col] | |
# 이동전 위치를 초기화한다. | |
_map[row][col] = [] | |
return r, c, [*temp,] | |
solve() |
728x90
'PS > 백준' 카테고리의 다른 글
[백준] 1074 Z (0) | 2021.03.16 |
---|---|
[백준] 17136 색종이 붙이기 (0) | 2021.03.15 |
[백준] 17135 캐슬 디펜스 (0) | 2021.03.14 |
[백준] 16236 아기 상어 (0) | 2021.03.14 |
[백준] 16235 나무 재테크 (0) | 2021.03.12 |