728x90
2차원 구현문제였다.
https://www.acmicpc.net/problem/17143
문제를 푸는 방법은 가이드대로 따라가며 구현하면 된다.
1. 낚시하기
2. 상어 움직이기
우선 2차원 배열을 통해 바다를 나타내고 상어가 존재하는 곳엔 배열로 [속도,방향,크기]를 두었다.
상어가 이동시에 겹치더라도 잡아먹히거나 먹는 것이 없으므로 상어의 움직임을 나타내는 경우에는 1초후의 바다를 그려주는 방법을 활용했다.
1. 방향 배열이 1~4이므로 dr,dc 배열의 크기를 5로 두었다.
2. 다음 상어의 위치를 가져오는 로직을 함수로 따로 분리 (getNextSharkDist)
R,C,M = map(int,input().split())
ocean = [ [[] for _ in range(C)] for __ in range(R)]
# 문제에서 제공한 방향과 인덱스를 맞춤
dc = [0,0,0,1,-1]
dr = [0,-1,1,0,0]
# 바다에 상어 정보 저장
for _ in range(M):
r,c,s,d,z = map(int,input().split())
ocean[r-1][c-1] = [s,d,z]
# 바다에서 벗어나는 범위인지 파악
def isCanGo(r,c):
return 0<=r and r< R and 0<=c and c<C
# 속도,거리를 계산하여 상어의 다음 위치 계산
def getNextSharkDist(s,d,r,c):
for _ in range(s):
nR = r + dr[d]
nC = c + dc[d]
if isCanGo(nR,nC):
r = nR
c = nC
else: # 갈 수 없다면 방향전환
d = d+1 if d%2 else d-1
r = r + dr[d]
c = c + dc[d]
return [r,c,d]
# 모든 상어들을 1초 움직임
def moveSharks(ocean):
ret = [ [[] for _ in range(C)] for __ in range(R)]
for i in range(R):
for j in range(C):
if len(ocean[i][j]) == 0:
continue
s,d,z = ocean[i][j]
nR,nC,nD = getNextSharkDist(s,d,i,j)
if len(ret[nR][nC]) and ret[nR][nC][2] >= z:
continue
ret[nR][nC] = [s,nD,z]
return ret
# 낚시꾼이 상어를 낚음
def killShark(col,ocean):
for row in range(R):
if len(ocean[row][col]):
ret = ocean[row][col][2]
ocean[row][col] = []
return ret
return 0
ret = 0
#시뮬레이션
for col in range(C):
ret += killShark(col,ocean)
ocean = moveSharks(ocean)
print(ret)
728x90