[백준 삼성기출 △] 낚시왕(python)

이진규·2022년 8월 13일
1

백준(PYTHON)

목록 보기
72/115

문제

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

나의 코드

"""

"""

from sys import stdin
input = stdin.readline

R, C, M = map(int, input().split()) # R행 C열 : 격자판의 크기, M : 상어의 수

# 인덱스0, 1 : 상어의 위치, 인덱스2 : 상어의 속력, 인덱스3 : 상어의 이동방향(1:북, 2:남, 3:동, 4:서), 인덱스4 : 상어의 크기
shark_info = [ list(map(int, input().split())) for _ in range(M) ]
pan = [ [ [] for _ in range(C+1) ] for _ in range(R+1) ]
answer = 0 # 낚시왕이 잡은 상어 크기의 합

for r, c, s, d, z in shark_info: # 상어의 정보 격자판에 업데이트
    pan[r][c].append((s, d, z))


dx, dy = [0, -1, 1, 0, 0], [0, 0, 0, 1, -1] # [의미없는숫자, 북, 남, 동, 서]
def shark_move(): # 상어의 이동
    tmp = [ [ [] for _ in range(C+1) ] for _ in range(R+1) ] # 빈 배열을 만들어 상어의 이동을 기록한다.

    for x in range(1, R+1):
        for y in range(1, C+1):
            if pan[x][y]: # 만약 상어 정보가 업데이트 되어있는 배열에 상어가 있다면
                s, d, z = pan[x][y].pop()
                mx = x
                my = y

                for _ in range(s):
                    if 1 <= mx + dx[d] <= R and 1 <= my + dy[d] <= C: # 범위 내에 있다면 이동한다.
                        mx += dx[d]
                        my += dy[d]

                    else: # 범위내에 없다면 반대 방향으로 바꾸어서 이동한다.
                        if d == 1: d = 2
                        elif d == 2: d = 1
                        elif d == 3: d = 4
                        elif d == 4: d = 3
                        mx += dx[d]
                        my += dy[d]

                if not tmp[mx][my]: # 도착지에 상어가 없다면 상어 정보를 업데이트 한다.
                    tmp[mx][my].append((s, d, z))
                else: # 도착지에 상어가 있다면 상어의 크기를 비교하여 큰 상어의 정보를 업데이트 한다.
                    ps, pd, pz = tmp[mx][my].pop()
                    if z > pz: tmp[mx][my].append((s, d, z))
                    elif z < pz: tmp[mx][my].append((ps, pd, pz))

    return tmp

for i in range(1, C+1):

    for j in range(1, R+1): # 낚시왕이 있는 열에 있는 상어 중에서 땅(1행)과 제일 가까운 상어를 잡는다.
        if pan[j][i]: # 만약 상어가 있다면
            s, d, z = pan[j][i].pop()
            answer += z # 상어 크기의 합을 구하고 pop()를 했으니 격자판에서 잡은 상어가 사라진다.
            break

    pan = shark_move() # 모든 상어가 이동하고 좌표가 업데이트된 배열을 돌려받는다.

print(answer)

# 헷갈린점
# 1. 상어를 움직여도 두번 실행될 수 있다. (함수를 구현해서 새로운 n차원 배열을 만들어 return 하는 방식으로 해결)
# 2. 상어 잡아먹는거 미 구현 (상어의 이동이 끝나면 해당 위치에 상어가 있는지 없는지 확인 후 만약 있다면 크기를 비교하는 식으로 해결)
    

설명

문제에 주어진대로 구현하면 되지만 상어가 이동을 할때는 새로운 함수에 빈 배열을 새로 만들어 모든 상어의 이동이 끝나면 배열을 돌려받는 식으로 하는걸 생각 못했다.

참고 자료

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글