본문 바로가기

알고리즘/삼성 기출

나무 재테크 [백준 16235번]

문제

 

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

 

16235번: 나무 재테크

부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터

www.acmicpc.net

 

내 풀이

 

문제에서 하라는 대로 구현하면 된다.

그러나 여기서 중요하게 여겨야 할 것은 봄과 여름을 묶어서 구현하고, 가을과 겨울을 묶어서 구현하는 것이다.

 

봄과 여름을 묶은 이유는, 봄을 구현하고 여름을 구현해도 여름은 죽은 나무가 원래 자신이 있던 칸에 양분으로 추가되기 때문에 다른 칸에 영향을 전혀 미치지 않기 때문이다.

 

그러나 가을은 나무가 번식하여 다른 칸에 영향을 주기 때문에 따로 구현해야 한다. 그래서 가을을 따로 빼고, 겨울은 어차피 양분을 추가하는 것밖에 없기 때문에 가을과 함께 구현하였다.

 

이것만 유념하면 뚝딱 풀 수 있다!

 

import copy

N, M, K = map(int, input().strip().split())
A = [list(map(int, input().strip().split())) for _ in range(N)]
land = [[[] for _ in range(N)] for _ in range(N)]
meal = [[5]*N for _ in range(N)]
dx, dy = [-1, -1, -1, 0, 0, 1, 1, 1], [-1, 0, 1, -1, 1, -1, 0, 1]
for _ in range(M):
    x, y, z = map(int, input().strip().split())
    land[x-1][y-1].append(z)
for _ in range(K):
    for i in range(N):
        for j in range(N):
            trees = sorted(land[i][j])
            if trees:
                # 봄
                live, dead = [], []
                for age in trees:
                    if meal[i][j] >= age:
                        meal[i][j] -= age
                        age += 1
                        live.append(age)
                    else:
                        dead.append(age//2)
                land[i][j] = copy.deepcopy(live)
                # 여름
                if dead:
                    meal[i][j] += sum(dead)
    for i in range(N):
        for j in range(N):
            for tree_age in land[i][j]:
                # 가을
                if not tree_age % 5:
                    for k in range(8):
                        nx, ny = i+dx[k], j+dy[k]
                        if 0<=nx<N and 0<=ny<N:
                            land[nx][ny].append(1)
            # 겨울
            meal[i][j] += A[i][j]
ans = 0
for i in range(N):
    for j in range(N):
        ans += len(land[i][j])
print(ans)

 

총평

굿!

'알고리즘 > 삼성 기출' 카테고리의 다른 글

톱니바퀴 [백준 14891번]  (0) 2022.10.09
아기 상어 [백준 16236번]  (1) 2022.10.08
경사로 [백준 14890번]  (1) 2022.10.08
연구소 3 [백준 17142번]  (0) 2022.10.08
마법사 상어와 파이어볼 [백준 20056번]  (0) 2022.10.07