본문 바로가기
CS/Algorithm

[BOJ][C++] 16235 나무재테크

by 별토끼. 2019. 2. 16.
반응형

[BOJ][C++] 16235 나무재테크

 

문제

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

 

풀이

시간초과 때문에 몇 번을 다시 풀었던 문제 입니다. 문제 풀면서 시간 고려도 하는 버릇을 길러야겠어요

2차원 배열에 벡터 형태로 나무를 쌓는 식(z축)으로 했습니다.

그리고 k년만큼 for문을 돌면서 봄, 여름, 가을, 겨울 을 순으로 코드를 짰어요.

 

봄 >

봄은 나이만큼 양분을 먹노 나이가 증가합니다. 나이만큼 양분이 없는 경우 여름에 비료로 쓸 수 있도록 dead배열을 하나 더 만들어 나이/2를 한 값을 저장해줍니다. 주의할 것은 나이가 어린 순 부터 비료를 쓸 수 있기에 sort를 해주었습니다.

여름 >

저장해 놓았던 dead배열의 값을 더해줍니다. 이 때, dead배열 초기화를 해줍니다.

가을 >

dx, dy 배열을 만들어 여덟 방향을 갈 수 있도록 해줍니다. 주의해야 할 것은 age배열에 나무를 추가해 심을 경우 나무의 수가 계속 변해서 오류가 날 수 있어요. 그렇기 때문에 임시 배열 하나를 만들어 복사해준 뒤 임시 배열에 나무를 심어줍니다. 5의 배수 나이를 갖고 있는 나무 주위로 모든 나무를 심어주고 나면 심은 나무를 다시 원본 배열에 복사해줍니다. 

겨울>

p_compost배열에 저장해놨던 값을 compost배열에 더해줍니다.

 

k년 만큼 모두 돌면 age[i][j]에 있는 나무들의 size를 측정해서 다 더해주면 됩니다.

 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;


int main() {
    int n, m, k;
    int p_compost[11][11];
    vector<int> age[11][11];
    int compost[11][11];
    int dead_tree[11][11];
    int dx[] = { 1,-1,0,0,1,-1,1,-1 };
    int dy[] = { 0,0,1,-1,1,-1,-1,1 };

    scanf("%d %d %d", &n, &m, &k);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            scanf("%d", &p_compost[i][j]);
            compost[i][j] = 5;
        }
    }

    //나무 입력받기
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        scanf("%d %d %d", &x, &y, &z);
        age[x][y].push_back(z);

    }
    //년도 증가
    for (int i = 0; i < k; i++) {
        //1.봄
        for (int p = 1; p <= n; p++) {
            for (int q = 1; q <= n; q++) {
                if (!age[p][q].empty()) {
                    sort(age[p][q].begin(), age[p][q].end());
                    for (int j = 0; j < age[p][q].size(); j++) {
                        if (compost[p][q] >= age[p][q][j]) {
                            compost[p][q] -= age[p][q][j];
                            age[p][q][j]++;
                        }
                        else {
                            dead_tree[p][q] += age[p][q][j] / 2;
                            age[p][q].erase(age[p][q].begin() + j);
                            j--;
                        }
                    }
                }
            }
        }

        //2.여름
        for (int p = 1; p <= n; p++) {
            for (int q = 1; q <= n; q++) {
                compost[p][q] += dead_tree[p][q];
            }
        }
        for (int p = 1; p <= n; p++) {
            for (int q = 1; q <= n; q++) {
                dead_tree[p][q] = 0;
            }
        }
        //3.가을
        vector<int> tmp[11][11];
        for (int p = 1; p <= n; p++) {
            for (int q = 1; q <= n; q++) {
                for (int j = 0; j < age[p][q].size(); j++) {
                    tmp[p][q].push_back(age[p][q][j]);
                }
            }
        }
        for (int p = 1; p <= n; p++) {
            for (int q = 1; q <= n; q++) {
                for (int j = 0; j < age[p][q].size(); j++) {
                    if (age[p][q][j] % 5 == 0) {
                        for (int l = 0; l < 8; l++) {
                            int nx = p + dx[l];
                            int ny = q + dy[l];
                            if (nx <= 0 || ny <= 0 || nx > n || ny > n) continue;
                            tmp[nx][ny].push_back(1);
                        }
                    }
                }
            }
        }
        for (int p = 1; p <= n; p++) {
            for (int q = 1; q <= n; q++) {
                age[p][q].clear();
                for (int j = 0; j < tmp[p][q].size(); j++) {
                    age[p][q].push_back(tmp[p][q][j]);
                }
            }
        }

        //4.겨울
        for (int p = 1; p <= n; p++) {
            for (int q = 1; q <= n; q++) {
                compost[p][q] += p_compost[p][q];
            }
        }
    }
    int res = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            res += age[i][j].size();
        }
    }
    printf("%d\n", res);
}

 

반응형

'CS > Algorithm' 카테고리의 다른 글

[BOJ][C++] 15662 톱니바퀴(2)  (0) 2019.02.25
[BOJ][C++] 14500 테트로미노  (0) 2019.02.21
[BOJ][C++] 1966 프린터 큐  (0) 2019.02.01
[Programmers][C++] 43165 타겟 넘버  (0) 2019.01.31
[BOJ][C++] N-Queen  (0) 2019.01.17

댓글