출처 : https://www.acmicpc.net/problem/17143
# Code
from collections import deque
def move():
## 상어의 위치를 파악한다.
location = set()
for i in range(R):
for j in range(C):
if board[i][j]: location.add((i, j))
## 상어를 하나하나 이동시킨다.
for i, j in location:
speed, direction, size = board[i][j].popleft()
if direction == UP:
i = i - speed
if i >= 0:
board[i][j].append([speed, direction, size])
else:
i = (-i) % ((R-1)*2)
if i <= R-1: direction = DOWN # 방향
i = row_list[i] # 위치
board[i][j].append([speed, direction, size])
elif direction == DOWN:
i = i + speed
if i <= R-1:
board[i][j].append([speed, direction, size])
else:
i = i % ((R-1)*2)
if i == 0 or i >= R: direction = UP # 방향
i = row_list[i] # 위치
board[i][j].append([speed, direction, size])
elif direction == LEFT:
j = j - speed
if j >= 0:
board[i][j].append([speed, direction, size])
else:
j = (-j) % ((C-1)*2)
if j <= C-1: direction = RIGHT
j = col_list[j]
board[i][j].append([speed, direction, size])
elif direction == RIGHT:
j = j + speed
if j <= C-1:
board[i][j].append([speed, direction, size])
else:
j = j % ((C-1)*2)
if j == 0 or j >= C: direction = LEFT
j = col_list[j]
board[i][j].append([speed, direction, size])
## 한 공간에 2마리 이상의 상어가 있을 경우
## 가장 큰 놈만 살아남는다.
for i in range(R):
for j in range(C):
if len(board[i][j]) > 1:
board[i][j] = deque([max(board[i][j], key = lambda x: x[2])])
if __name__ == '__main__':
## 세로(R), 가로(C), 상어수(M)
R, C, M = map(int, input().split())
board = [[deque() for j in range(C)] for i in range(R)]
for _ in range(M):
## 위치(r,c), 속력(s), 방향(d), 크기(z)
r, c, s, d, z = map(int, input().split())
board[r-1][c-1].append([s, d, z])
UP = 1
DOWN = 2
RIGHT = 3
LEFT = 4
row_list = [i for i in range(R)]
for i in range(R-2, 0, -1): row_list.append(i)
col_list = [i for i in range(C)]
for i in range(C-2, 0, -1): col_list.append(i)
king = -1
sv = 0
while True:
## 1. 낚시왕이 오른쪽으로 한칸 움직인다.
king += 1
## 2. 낚시왕이 있는 열에 있는 상어 중, 땅과 제일 가까운 상어를 잡는다.
## 잡힌 상어는 격자판에서 사라진다.
for i in range(R):
if board[i][king]:
shark = board[i][king].pop()
sv += shark[-1]
break
## 3. 상어가 이동한다.
move()
if king == C-1: break
print(sv)
|
cs |
'알고리즘 > [Python] 백준' 카테고리의 다른 글
[Python] 백준 17140번: 이차원 배열과 연산 (0) | 2020.04.19 |
---|---|
[Python] 백준 1987번: 알파벳 (0) | 2020.04.19 |
(Python) 백준 18809번: Gaaaaaaaaaarden (0) | 2020.03.25 |
(Python) 백준 18808번: 스티커 붙이기 (0) | 2020.03.24 |
(Python) 백준 16235번: 나무 재테크 (1) | 2020.03.20 |