짱아의 개발 기록장

[Algorithm] 2018 하반기 삼성전자 코딩테스트 - 나무재테크(c++) 본문

Algorithm/삼성 sw 역량테스트 기출

[Algorithm] 2018 하반기 삼성전자 코딩테스트 - 나무재테크(c++)

jungahshin 2020. 9. 17. 16:50
반응형

정말 말 그대로 문제에서 봄, 여름, 가을, 겨울에 해당하는 조건들을 다 구현해주면 되는 구현문제이다.

다만, 어떠한 자료구조에 나무의 상태, 양분의 상태를 저장할지 코드를 설계하는 초반 작업이 중요하다고 생각된다.

 

글쓴이는

vector<int> tree[11][11]; 에 나무의 상태를 저장했다. (한 칸에도 여러 그루의 나무가 있을 수 있기 때문)

그리고 2차원 배열 형태로 양분을 저장했다.

 

 

코드 첨부

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// 나무재테크
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
 
using namespace std;
 
int n, m, k, x, y, z;
int vitamin[11][11= {0, }; // 땅이 가지고 있는 양분
int summer_vit[11][11= {0, }; // 여름에 추가할 양분
int a[11][11= {0, }; // 겨울에 추가할 양분
vector<int> tree[11][11];
int dx[8= {-1-1-100111};
int dy[8= {-101-11-101};
 
void Spring()
{
    memset(summer_vit, 0sizeof(summer_vit));
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            if(tree[i][j].size()>0){
                sort(tree[i][j].begin(), tree[i][j].end());
                int idx = 0// 죽을 나무의 인덱스 저장   
                bool check = false;
                for(int k=0; k<tree[i][j].size(); k++){
                    if(vitamin[i][j]>=tree[i][j][k]){
                        vitamin[i][j] -= tree[i][j][k];
                        tree[i][j][k]++;
                    }else{
                        if(check==false){
                            check = true;
                            idx = k;
                        }
                        summer_vit[i][j] += (tree[i][j][k]/2);
                    }
                }
 
                if(check==true){
                    tree[i][j].erase(tree[i][j].begin()+idx, tree[i][j].end());
                }
            }
        }
    }
}
 
void Summer()
{
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            vitamin[i][j] += summer_vit[i][j];
        }
    }
}
 
void Fall()
{
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            if(tree[i][j].size()>0){
                for(int k=0; k<tree[i][j].size(); k++){
                    if(tree[i][j][k]%5==0){
                        for(int t=0; t<8; t++){
                            int nx = i+dx[t];
                            int ny = j+dy[t];
 
                            if(1<=nx && nx<=&& 1<=ny && ny<=n){
                                tree[nx][ny].push_back(1);
                            }
                        }
                    }
                }
            }
        }
    }
}
 
void Winter()
{
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            vitamin[i][j] += a[i][j];
        }
    }
}
 
int main()
{
    cin>>n>>m>>k;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            cin>>a[i][j];
            vitamin[i][j] = 5;
        }
    }
 
    for(int i=0; i<m; i++){
        cin>>x>>y>>z;
        tree[x][y].push_back(z);
    }
 
    for(int i=0; i<k; i++){
        Spring();
        Summer();
        Fall();
        Winter();  
    }
 
    int cnt = 0;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            cnt += tree[i][j].size();
        }
    }
 
    cout<<cnt<<"\n";
    return 0;
}
cs

 

문제 첨부

www.acmicpc.net/problem/16235

 

16235번: 나무 재테크

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

www.acmicpc.net

 

github 첨부

github.com/jungahshin/algorithm/blob/master/c:c%2B%2B/16235_review_3.cpp

 

jungahshin/algorithm

algorithm study. Contribute to jungahshin/algorithm development by creating an account on GitHub.

github.com

반응형
Comments