[백준 삼성기출 △] 나무 재테크(python)

이진규·2022년 8월 10일
1

백준(PYTHON)

목록 보기
70/115

문제

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

나의 코드

"""

"""

from collections import deque
from sys import stdin
input = stdin.readline

n, m, k = map(int, input().split()) # n : 땅의 크기, m : 나무의 개수, k : 시간(년)
A = [ list(map(int, input().split())) for _ in range(n) ] # 양분의 양을 기록해놓은 2차원 배열
tree = [ [ deque() for _ in range(n) ] for _ in range(n) ] # 나무의 나이를 기록해놓은 3차원 배열
pan = [ [5] * n for _ in range(n) ] # 땅의 양분을 기록해놓은 2차원 배열

for _ in range(m): # 나무의 좌표에 나이를 기록한다.
    x, y, z = map(int, input().split())
    tree[x-1][y-1].append(z)

def spring_summer(): # 봄, 여름
    for i in range(n):
        for j in range(n):
            tree_cnt = len(tree[i][j])
            for k in range(tree_cnt): # 나무가 있는 좌표에 나무 개수만큼 반복문을 진행한다.
                if pan[i][j] >= tree[i][j][k]: # 땅에 양분이 풍족한 경우 (봄)
                    pan[i][j] -= tree[i][j][k] # 나무가 자신의 나이만큼 양분을 먹음
                    tree[i][j][k] += 1
                else: # 땅에 양분이 부족해 나무가 죽는 경우 (여름)
                    for _ in range(k, tree_cnt): # pop()을 통해 나이가 많은 것 부터 양분으로 변환시킨다.
                        pan[i][j] += tree[i][j].pop() // 2
                    break

dx, dy = [-1, -1, -1, 0, 1, 1, 1, 0], [-1, 0, 1, 1, 1, 0, -1, -1]
def fall_winter(): # 가을, 겨울
    for x in range(n):
        for y in range(n):
            tree_cnt = len(tree[x][y])
            for k in range(tree_cnt): # 나무가 있는 좌표에 나무 개수만큼 반복문을 진행한다.
                if tree[x][y][k] % 5 == 0: # 나이가 5의 배수이면 8방향으로 범위를 확인 후 번식을 진행한다 (가을)
                    for l in range(8):
                        mx = x + dx[l]
                        my = y + dy[l]
                        if 0 <= mx < n and 0 <= my < n:
                            tree[mx][my].appendleft(1) # appendleft를 통해 오름차순을 유지해준다.

            pan[x][y] += A[x][y] # 전체 반복문으로 양분을 추가해준다 (겨울)

for _ in range(k):
    spring_summer()
    fall_winter()

answer = 0
for i in range(n):
    for j in range(n):
        answer += len(tree[i][j]) # 한 좌표에 나무가 2개 이상인 경우가 있으므로 이렇게 나무의 개수를 구해준다
print(answer)
    

설명

spring_summer()에 i, j 부분과
fall_winter()에 x, y 부분이 있는데
fall_winter()에 무심코 i, j를 썼다가 오답이 나옴

spring_summer()과 fall_winter()은 같은 반복문 내에 있으므로 변수를 공유하기 때문에 i, j가 중복되어 이상한 값이 들어간다. 이런 부분 작은 실수이지만 왜 오답인지 찾기가 어려우니 조심하자.

참고 자료

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

0개의 댓글