본문 바로가기
알고리즘 문제풀이/백준

[백준 16235] 나무 재테크

by m2162003 2020. 12. 26.

www.acmicpc.net/problem/16235

 

16235번: 나무 재테크

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

www.acmicpc.net

어렵진 않았는데 조건이 너무 복잡했던 문제..

봄+여름/ 가을/ 겨울로 나눠준다.

 

가을 겨울은 상대적으로 쉬우니까 패스

봄이랑 여름이 같이 구현되는게 편하다.

 

이 때 주의할 점은 

1. 봄에 양분을 먹고 나이가 증가한다는 점

2. 죽은 나무가 주는 양분은 나무가 전부 죽은 후 생긴다는 점: 여름에 죽은 나무가 양분이 되기 때문

이 두 가지를 체크해야 한다.

#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

int n, m, k;
int arr[10][10];
int fert[10][10];

int dr[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dc[8] = {-1, 0, 1, -1, 1, -1, 0, 1};

vector<int> trees[10][10];

int tree;

void SpringAndSummer()
{
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      sort(trees[i][j].begin(), trees[i][j].end());
      int dieEnergy = 0;
      for (int k = 0; k < trees[i][j].size(); k++)
      {
      //양분이 나무나이보다 많으면
        if (arr[i][j] >= trees[i][j][k])
        {
          arr[i][j] -= trees[i][j][k]; //양분을 먹고
          trees[i][j][k]++; // 한살 증가
        }
        else
        {
        //소팅했으므로 뒤에 나무는 양분 전부 불가능. 전부 팝해준다.
          int smaller = k;
          for (int q = trees[i][j].size() - 1; q >= smaller; q--)
          {
            dieEnergy += trees[i][j][q] / 2;
            trees[i][j].pop_back();
            tree--;
          }
          break;
        }
      }
      arr[i][j] += dieEnergy; //여름에 죽은 나무가 양분으로 변하므로 마지막에 해야함
    }
  }
}

void Fall()
{
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      for (int k = 0; k < trees[i][j].size(); k++)
      {

        if (trees[i][j][k] % 5 == 0)
        {
          for (int q = 0; q < 8; q++)
          {
            int nr = i + dr[q];
            int nc = j + dc[q];

            if (nr < 0 || nc < 0 || nr > n - 1 || nc > n - 1)
            {
              continue;
            }
            trees[nr][nc].push_back(1);
            tree++;
          }
        }
      }
    }
  }
}

void Winter()
{
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      arr[i][j] += fert[i][j];
    }
  }
}

int main(void)
{
  scanf("%d%d%d", &n, &m, &k);

  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      arr[i][j] = 5;
      scanf("%d", &fert[i][j]);
    }
  }
  tree = m;

  for (int i = 0; i < m; i++)
  {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);

    trees[x - 1][y - 1].push_back(z);
  }

  while (k--)
  {
    SpringAndSummer();
    Fall();
    Winter();
  }
  printf("%d\n", tree);
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 17451] 평행 우주  (0) 2020.12.27
[백준 16918] 봄버맨  (0) 2020.12.27
[백준 16236] 아기 상어  (0) 2020.12.26
[백준 1722] 순열의 순서  (0) 2020.12.25
[백준 17140] 이차원 배열과 연산  (0) 2020.12.23

댓글