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 개 쓴이유는 이동한 상어와 아직 이동하지 않은 상어를 구분하기 위해서 입니다.
이동한 상어가 자신의 위치에 이동하지 않은 상어가 있다면 상관없지만 그 위치에 이동한 상어가 있다면 예외처리를 해주어야 합니다.