카테고리 없음

[PY] 17143_낚시왕

728x90

2차원 구현문제였다.

 

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

 

17143번: 낚시왕

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

www.acmicpc.net

 

 

문제를 푸는 방법은 가이드대로 따라가며 구현하면 된다.

 

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