728x90
SMALL

'''
1. 일단 잡고,
2. 상어 이동하고,
2-1. 상어 먹히고
'''
R, C, M = map(int, input().split())
sharks = [list(map(int, input().split())) for _ in range(M)]
sharks_grid = [[None] * (C+1) for _ in range(R+1)]
for r, c, s, d, z in sharks:
sharks_grid[r][c] = (s, d, z)
'''
4 1 3 3 8
상어 정보가 들어오면, 가장 땅에 가까운 상어를 잡아서 해당 상어의 크기를 반환하도록 함
결과적으로 크기의 합을 answer로 출력해야하기 때문에
'''
def fishing(pos, grid):
# del 용도로 저장 -> 잡았으면 해당 배열에서 삭제하기 위함
# del은 인덱스로 접근하기 때문에 느릴 수 밖에 없음
# 따라서 del보다는 새로 리스트를 구축하는 것이 빠를 수 있음
for r in range(1, len(grid)):
if grid[r][pos]:
s, d, z = grid[r][pos]
grid[r][pos] = None
return z
return 0
'''
다시 돌아오는 주기: 높이가 4일 때, 원위치하는 주기는 6 / 너비가 6일 때, 원위치하는 주기가 10
높이가 H일 때, 주기는 (H-1)*2 / 너비가 W일 때, 주기는 (W-1)*2
반환하는 건 변하는 것들 (좌표, 방향) 정보 ! 맵 크기와 속력은 고정
'''
def move_shark(R, C, r, c, s, d):
if d in (1, 2):
move = s % ((R-1) * 2)
else:
move = s % ((C-1) * 2)
for _ in range(move):
# 위로 가다가 땅에 부딪혔을 때,
if d == 1 and r == 1:
d = 2
# 아래로 가다가 바닥에 부딪혔을 때,
elif d == 2 and r == R:
d = 1
# 오른쪽으로 가다가 벽에 부딪혔을 때,
elif d == 3 and c == C:
d = 4
# 왼쪽 가다가 벽에 부딪혔을 때,
elif d == 4 and c == 1:
d = 3
# 실제로 이동하는 건
if d == 1:
r -= 1
elif d == 2:
r += 1
elif d == 3:
c += 1
elif d == 4:
c -= 1
return r, c, d
'''
크기에 따른 상어 먹힘과 새로운 grid를 반환해주는 함수
'''
def eat_sharks(grid, R, C):
new_grid = [[None] * (C+1) for _ in range(R+1)]
for r in range(1, R+1):
for c in range(1, C+1):
# 없으면 그냥 놔두고,
if not grid[r][c]:
continue
# 있으면 info 꺼내와서
s, d, z = grid[r][c]
# 이동 시켜주고,
nr, nc, nd = move_shark(R, C, r, c, s, d)
# 이미 상어가 존재한다면,
if new_grid[nr][nc]:
if new_grid[nr][nc][2] < z:
# 크기가 더 큰 상어로 대체해주기
new_grid[nr][nc] = (s, nd, z)
# 없으면 그냥 덮어씌우기
else:
new_grid[nr][nc] = (s, nd, z)
return new_grid
answer = 0
for pos in range(1, C+1):
answer += fishing(pos, sharks_grid)
sharks_grid = eat_sharks(sharks_grid, R, C)
print(answer)
왜 이렇게 풀었을까?
- 해당 문제는 문제 설명대로 잘 구현할 수 있느냐에 초점을 둔 문제 같았습니다.
- 코드는 길어보이지만, 실제로 생각해야하는 부분은 그리 많지 않았습니다.
- 처음에는 기존 grid를 update하거나 del하는 방법을 생각했었는데, 이 방법은 상어가 많아질수록 효율적이지 못했습니다. 그래서 결국 새로운 grid를 새로 만들어주자 하는 방식을 떠올렸습니다.
- 제가 위 코드에서 가장 중요하게 생각한 부분은 격자와 여러 가지 정보가 같이 주어졌을 때, 이를 2차원 grid의 형태로 잘 나타낼 수 있는지, 그리고 상어가 벽에 부딪혔을 때, 이를 어떻게 효율적으로 계산할 수 있는지 였습니다.
- 저는 여러 문제들을 만나겠지만, grid[r][c] = (여러 정보들...) 과 같은 패턴, 그리고 반복이 이뤄지는 시뮬레이션에서 주기를 계산하는 기법은 앞으로도 유용하게 쓰일 것 같습니다.
728x90
LIST
'알고리즘 문제 풀이 > Class (solved.ac)' 카테고리의 다른 글
| 🏫 전깃줄 - 2 (Class 5++) (2) | 2025.11.04 |
|---|---|
| 🏫 벽 부수고 이동하기 4 (Class 5++) (0) | 2025.03.04 |
| 🏫 공항 (Class 5++) (0) | 2025.02.26 |
| Class 2 (팩토리얼 0의 개수 ~ 좌표 정렬하기) (4) | 2023.12.20 |
| Class 2 (달팽이는 올라가고 싶다 ~ 영화감독 숌) (0) | 2023.12.18 |