(Python) 백준 17143번: 낚시왕
알고리즘/[Python] 백준

(Python) 백준 17143번: 낚시왕

출처 : https://www.acmicpc.net/problem/17143

 

17143번: 낚시왕

낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다. 칸에는 상어가 최대 한 마리 들어있을 수 있다. 상어는 크기와 속도를 가지고 있다. 낚시왕은 처음에 1번 열의 한 칸 왼쪽에 있다. 다음은 1초 동안 일어나는 일이며, 아래 적힌 순서대로 일어난다. 낚시왕은 가장 오른쪽 열의 오른쪽 칸에 이동하

www.acmicpc.net


 

# 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-20-1): row_list.append(i)
    
    col_list = [i for i in range(C)]
    for i in range(C-20-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