백준 17143 : 낚시왕 (Python)

liliili·2023년 3월 7일

백준

목록 보기
197/214

본문 링크

import sys
input=sys.stdin.readline
from collections import deque

shark=[ [ deque() for _ in range(101) ] for _ in range(101) ]
shark2=[[deque() for _ in range(101)] for _ in range(101)]


def Delete(idx): # 물고기는 한마리만 잡는다.
    global ans
    for i in range(N):
        if len(shark[i][idx])>0:
            ans+=shark[i][idx][2]
            shark[i][idx].clear()
            return

def Input(K):
    for i in range(K):
        x,y,s,d,z=map(int,input().split())
        shark[x-1][y-1].append(s)
        shark[x-1][y-1].append(d)
        shark[x-1][y-1].append(z)
#입력때 두 상어가 같은 크기를 갖는 경우는 없고, 하나의 칸에 둘 이상의 상어가 있는 경우는 없다.

def Move(x,y):
    s,d,z=shark[x][y][0] , shark[x][y][1] , shark[x][y][2]
    if s==0: # 속력이 0 일때
        if len(shark2[x][y])>0:
            if z > shark2[x][y][2]:  # 방문한 지점에 자기가 더 크다면 바꾼다.
                shark2[x][y].append(s)
                shark2[x][y].append(d)
                shark2[x][y].append(z)
            else:  # 방문한 지점에 방문한 상어가 더 크다면 return
                return
        else:
            shark2[x][y].append(s)
            shark2[x][y].append(d)
            shark2[x][y].append(z)
            return

    if d<=2: # 위 아래일 경우
        for i in range(s%((N-1)*2)): # 세로길이의 나머지만큼만 이동한다.
            if d==1:
                if x-1>=0:
                    x-=1
                else:
                    d=2
                    x+=1
            else:
                if x+1<N:
                    x+=1
                else:
                    d=1
                    x-=1
    else: # 오른쪽 왼쪽일 경우\
        for i in range(s%((M-1)*2)): # 가로길이의 나머지만큼만 이동한다.
            if d==3:
                if y+1<M:
                    y+=1
                else:
                    y-=1
                    d=4
            else:
                if y-1>=0:
                    y-=1
                else:
                    y+=1
                    d=3

    if len(shark2[x][y])>0:
        if z>shark2[x][y][2]: # 방문한 지점에 자기가 더 크다면 바꾼다.
            shark2[x][y].clear()
            shark2[x][y].append(s)
            shark2[x][y].append(d)
            shark2[x][y].append(z)
        else: # 방문한 지점에 방문한 상어가 더 크다면 return
            return
    else:
        shark2[x][y].append(s)
        shark2[x][y].append(d)
        shark2[x][y].append(z)

#s는 속력, d는 이동 방향, z는 크기이다.
#d가 1인 경우는 위, 2인 경우는 아래, 3인 경우는 오른쪽, 4인 경우는 왼쪽을 의미한다.
def Play():
    global shark
    check=[]
    for i in range(N):
        for j in range(M):
            if len(shark[i][j])>0:
                check.append((i,j))
    for i,j in check:
        Move(i,j)


N,M,K=map(int,input().split())
Input(K)
ans = 0

for _ in range(M):
    Delete(_)
    Play()
    shark = [[deque() for _ in range(101)] for _ in range(101)]
    shark=[ i[:] for i in shark2]
    shark2 = [[deque() for _ in range(101)] for _ in range(101)]

print(ans)

📌 어떻게 풀것인가?

문제는 엄청 간단합니다. 개인적으로 골드4~5 정도의 수준이라고 생각합니다.

문제에서 주의해야할 점이 있습니다. 매번 오른쪽으로 이동하면서 낚시를 통해 잡을 수 있는 상어의 개수는 최대 1 개 입니다.

따라서 만약 낚시를 통해서 상어를 잡았다면 바로 함수를 종료시켜야 합니다.

이동하는 부분도 이동한 후에 인덱스 검사를 하는것보다 다음으로 이동할 칸에 인덱스 범위를 체크를 미리 해주고 이동을 해주는게 좋습니다.

shark = [[deque() for _ in range(101)] for _ in range(101)]
shark=[ i[:] for i in shark2]
shark2 = [[deque() for _ in range(101)] for _ in range(101)]

배열을 2개 썼습니다. 지금의 상어 위치와 다음으로 이동할 상어의 위치를 저장할 배열입니다.
shark2 에 이동한 상어의 위치가 저장되면 shark 에다가 shark2 의 내용을 덮어주었습니다.

속력이 0 일때 , 다른상어가 자기위치에 도착한 경우와 이동했을때 그 위치에 이동했던 상어가 있는 경우만 주의하면될꺼같습니다.

배열을 2 개 쓴이유는 이동한 상어와 아직 이동하지 않은 상어를 구분하기 위해서 입니다.
이동한 상어가 자신의 위치에 이동하지 않은 상어가 있다면 상관없지만 그 위치에 이동한 상어가 있다면 예외처리를 해주어야 합니다.

0개의 댓글