Algorithm/Python

[백준 17143] 낚시왕

🥭맹2 2021. 4. 20. 03:54

1. 문제

www.acmicpc.net/problem/17143

 

17143번: 낚시왕

낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다.

www.acmicpc.net

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