[ BOJ / Python ] 17143번 낚시왕

황승환·2022년 5월 26일
0

Python

목록 보기
313/498


이번 문제는 삼성 기출 문제로, 시뮬레이션을 구현해야 했다. 시뮬레이션을 쉽게 구현하기 위해 모듈화를 적용하며 풀이했다. 처음에 풀이를 했을 때에는 테스트 케이스의 값들은 잘 나왔지만, 시간초과가 발생하였다. 그래서 변수들의 범위를 확인해보았고, s의 범위가 1000이라는 것을 보고 이를 해결하기 위한 방법을 생각하였다. 만약 범위를 넘어가면 첫번째 인덱스부터 다시 시작하는 방식이었다면 %r과 %c를 한 값을 사용하면 됐지만, 이 문제는 다시 돌아가는 방식이기 때문에 고민을 많이 하였다. 결론적으로는 %(r-1)*2와 %(c-1)*2를 적용하면 범위를 넘었을 때 방향을 틀어 움직이는 것까지 캐치할 수 있었다. 이 방식을 적용하여 다음과 같은 함수들을 작성하였다.

  • move_shark()
    상어의 움직임을 구현
  • move_fisher()
    낚시왕의 움직임을 구현
  • fishing()
    해당 컬럼의 가장 위에 있는 상어를 제거하는 과정 구현

Code

r, c, m=map(int, input().split())
grid=[[-1 for _ in range(c)] for _ in range(r)]
shark=[]
for i in range(m):
    y, x, s, d, z=map(int, input().split())
    grid[y-1][x-1]=i
    if d<=2:
        s%=(r-1)*2
    else:
        s%=(c-1)*2
    shark.append([s, d-1, z])
dy, dx=[-1, 1, 0, 0], [0, 0, 1, -1]
cur=-1
answer=0
def move_shark():
    tmp=[[-1 for _ in range(c)] for _ in range(r)]
    for i in range(r):
        for j in range(c):
            if grid[i][j]!=-1:
                cnt=0
                ny, nx=i, j
                while cnt<shark[grid[i][j]][0]:
                    cnt+=1
                    ny, nx=ny+dy[shark[grid[i][j]][1]], nx+dx[shark[grid[i][j]][1]]
                    if 0<=ny<r and 0<=nx<c:
                        continue
                    else:
                        if shark[grid[i][j]][1]%2==0:
                            shark[grid[i][j]][1]+=1
                        else:
                            shark[grid[i][j]][1]-=1
                        ny, nx=ny+2*dy[shark[grid[i][j]][1]], nx+2*dx[shark[grid[i][j]][1]]
                if tmp[ny][nx]!=-1:
                    if shark[tmp[ny][nx]][2]<shark[grid[i][j]][2]:
                        tmp[ny][nx]=grid[i][j]
                else:
                    tmp[ny][nx]=grid[i][j]
    for i in range(r):
        for j in range(c):
            grid[i][j]=tmp[i][j]
def move_fisher():
    global cur
    cur+=1
def fishing():
    global answer
    for i in range(r):
        if grid[i][cur]!=-1:
            answer+=shark[grid[i][cur]][2]
            grid[i][cur]=-1
            break
while True:
    move_fisher()
    if cur==c:
        break
    fishing()
    move_shark()
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글