[코드트리] 생명과학부 랩 인턴 (python)

HaYeong Jang·2021년 10월 17일
0
post-thumbnail

🔗 문제 링크

https://www.codetree.ai/frequent-problems/biology-lab-intern

https://www.acmicpc.net/problem/17143 (백준 - 낚시왕)

👩🏻‍💻 코드

import sys

BLANK = (-1, -1, -1)
dx = [0, -1, 1, 0, 0]  # 위, 아래, 오른쪽, 왼쪽
dy = [0, 0, 0, 1, -1]

n, m, k = map(int, sys.stdin.readline().rstrip().split())
maps = [[BLANK] * (m + 1) for _ in range(n + 1)]
next_maps = [[BLANK] * (m + 1) for _ in range(n + 1)]
answer = 0

def collect(col):
    global answer
    for row in range(n + 1):
        if maps[row][col] != BLANK:
            answer += maps[row][col][0]
            maps[row][col] = BLANK
            break


def move_all():
    for i in range(n + 1):
        for j in range(m + 1):
            next_maps[i][j] = BLANK

    for i in range(n + 1):
        for j in range(m + 1):
            if maps[i][j] != BLANK:
                move(i, j)

    for i in range(n + 1):
        for j in range(m + 1):
            maps[i][j] = next_maps[i][j]


def move(x, y):
    b, s, d = maps[x][y]

    for _ in range(s):
        nx = x + dx[d]
        ny = y + dy[d]

        if 0 < nx <= n and 0 < ny <= m:
            x, y = nx, ny
        else:
            if d % 2 == 0:
                d -= 1
            else:
                d += 1
            x, y = x + dx[d], y + dy[d]

    if b > next_maps[x][y][0]:
        next_maps[x][y] = (b, s, d)


for _ in range(k):
    x, y, s, d, b = map(int, sys.stdin.readline().rstrip().split())

    if d <= 2:  # 상하
        s %= (2 * n - 2)
    else:  # 좌우
        s %= (2 * m - 2)
    maps[x][y] = (b, s, d)

for j in range(1, m + 1):
    collect(j)
    move_all()

print(answer)

📝 정리

  1. collect() 함수를 통해 처음으로 마주친 곰팡이 채취
  2. next_maps를 초기화한 후,
  3. move()를 통해 각 곰팡이들 이동시켜서 next_maps에 기록
    3-1. b(크기) 비교 후 큰 걸로 기록
  4. maps에 next_maps 대입

💡 기억해야 할 것

  • 속도 & 방향이 나오는 문제는 2n-2만큼 모듈러(%) 연산을 적용하면 위치를 쉽게 구할 수 있다.
  • map과 관련된 문제들은 하나 계산 후 바로 적용하지 말고, next_maps를 만들고 다시 옮기자.
profile
기억하기 위해 기록하는 개발로그👣

0개의 댓글

관련 채용 정보