1. 문제
2. 접근 방법
문제 그대로 잘 따라가면 된다.
근데 주의해야할 것은
상어 정보 (r, c, s, d, z)에서 r은 행이고 c는 열이라는 것과
격자판 크기 R, C 또한 행, 렬 순이라는 것
그리고 r, c는 1부터 시작한다는 것
시간마다 board를 초기화 해줘서
같은 칸에 상어가 여러 마리 들어갈 경우를 생각했다.
죽은 상어를 찾으려고 처음에 상어를 크기가 큰 순서대로 정렬하고
큰 상어 먼저 칸에 넣은 다음,
작은 상어가 해당 칸에 들어가려고 하면 move함수에서 False를 리턴해준다.
그래서 move함수에서 False리턴 값을 받은 상어는 죽은 상어라
그에 맞는 로직을 만들어주면 된다.
3. 코드
python
def isBoard(x, y):
if 0 <= x < C and 0 <= y < R:
return True
return False
def move(x, y, s, d, z):
global board, sharks
for i in range(s):
if isBoard(x+dir[d][0], y+dir[d][1]):
x += dir[d][0]
y += dir[d][1]
else:
if d%2:
d = (d+1)%4
else:
d = (d+3)%4
x += dir[d][0]
y += dir[d][1]
if board[y][x] > z:
return False
return (x, y, d)
R, C, M = map(int, input().split())
sharks = [list(map(int, input().split())) for _ in range(M)]
sharks.sort(key=lambda x : x[4], reverse=True)
# r(y), c(x), s(속력), d(방향), z(크기)
dir = ((-1, 0), (0, -1), (0, 1), (1, 0))
board = [[0]*C for _ in range(R)]
for i in range(M):
y, x, s, d, z = sharks[i]
board[y-1][x-1] = z
ans = 0
for t in range(C):
# 상어 잡음
for y in range(R):
if board[y][t] != 0:
ans += board[y][t]
board[y][t] = 0
for i in range(len(sharks)):
_y, _x = sharks[i][0]-1, sharks[i][1]-1
if y == _y and t == _x:
sharks[i] = [0]*5
break
# 상어 이동 -> 만약 이미 상어가 존재한다면 -> 작은 상어 죽이기
board = [[0]*C for _ in range(R)]
for i in range(M):
if sharks[i] != [0]*5:
y, x, s, d, z = sharks[i]
y -= 1
x -= 1
d %= 4
can_move = move(x, y, s, d, z)
if not can_move:
sharks[i] = [0] * 5
else:
tx, ty, d = can_move
board[ty][tx] = z
sharks[i] = [ty+1, tx+1, s, d, z]
print(ans)
4. 마치며
아 자꾸 인덱스에서 문제다 즈응으응말
'Algorithm > Python' 카테고리의 다른 글
[백준 17142] 연구소3 (0) | 2021.04.20 |
---|---|
[백준 17140] 이차원 배열과 연산 (0) | 2021.04.20 |
[백준 17144] 미세먼지 안녕! (0) | 2021.04.20 |
[백준 16234] 인구 이동 (0) | 2021.04.19 |
[백준 5373] 큐빙 (0) | 2021.04.19 |