7-M 질문입니다.
312
22 asked
선생님 안녕하세요!
테스트케이스 3번의 답이 왜 2인지 모르겠습니다. 테스트케이스부터 이해를 못 했기 때문에 코드는 없습니다..
봄/여름 로직에서 첫 번째 나무 (2, 1, 3)은 양분[2][1]의 값이 2이기 때문에 죽고 두 번째 나무 (3, 2, 3)은 양분[3][2]의 값이 3이기 때문에 죽지 않습니다.
가을 로직에서 첫 번째 나무는 이미 죽었으니 고려하지 않고 두 번째 나무는 나이가 4가 되는데 5의 배수가 아니기 때문에 새로운 나무가 생겨나지 않는다고 생각했습니다.
제가 어디를 잘못 생각하고 있는지 궁금합니다.
Answer 2
1
일단 문제 지문을 보시면 "모든 칸에 대해서 조사를 한다. 가장 처음에 양분은 모든 칸에 5만큼 들어있다." 이런 지문이 있습니다. 이거 보시고 다시 생각해보시겠어요?
또한, 제 코드에 디버깅 코드를 추가한 코드를 드립니다. 예제3을 하면 이런식으로 디버깅 됩니다. 이거 참고해서 다시 생각해보시겠어요?
#include<bits/stdc++.h>
using namespace std;
int n, m, k, A[14][14], yangbun[14][14], ret;
vector<int> _map[14][14];
const int dx[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
const int dy[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
void springSummer(){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(_map[i][j].size() == 0) continue;
int die_tree = 0;
vector<int> temp;
sort(_map[i][j].begin(), _map[i][j].end());
for(int tree : _map[i][j]){
if(yangbun[i][j] >= tree){
yangbun[i][j] -= tree;
temp.push_back(tree + 1);
}else{
//만약 그렇지 않다면 죽어버려!!
die_tree += tree / 2;
}
}
_map[i][j].clear();
_map[i][j] = temp;
yangbun[i][j] += die_tree;
}
}
}
void fall(){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(_map[i][j].size() == 0) continue;
for(int tree : _map[i][j]){
if(tree % 5 == 0){
for(int d = 0; d < 8; d++){
int ny = i + dy[d];
int nx = j + dx[d];
if(ny < 0 || ny >= n || nx < 0 || nx >= n) continue;
_map[ny][nx].push_back(1);
}
}
}
}
}
}
void winter(){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
yangbun[i][j] += A[i][j];
}
}
}
void print(){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cout << yangbun[i][j] << " ";
}
cout << '\n';
}
cout << "---턴종료\n";
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m >> k;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin >> A[i][j];
yangbun[i][j] = 5;
}
}
for(int i = 0; i < m; i++){
int _a, _b, _c; cin >> _a >> _b >> _c; _a--; _b--;
_map[_a][_b].push_back(_c);
}
for(int i = 0; i < k; i++){
springSummer();fall(); winter();
print();
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
ret += _map[i][j].size();
}
}
cout << ret << "\n";
return 0;
}
/*
예제3입력
5 2 1
2 3 2 3 2
2 3 2 3 2
2 3 2 3 2
2 3 2 3 2
2 3 2 3 2
2 1 3
3 2 3
출력 :
7 8 7 8 7
4 8 7 8 7
7 5 7 8 7
7 8 7 8 7
7 8 7 8 7
---턴종료
2
*/
0
헉 바로 이해했습니다. 처음에 양분이 5 들어가는 걸 놓쳤군요... 그러면 첫 번째 나무가 죽지 않기 때문에 정답이 2가 되는 게 맞네요. 디버깅 코드를 보니 더 잘 이해가 됩니다. 답변 감사합니다!!
1-E질문입니다!
0
509
2
3-L 틀린 부분 피드백 부탁드립니다.
0
811
2
1-A문제 순열재귀함수 질문입니다.
0
376
1
1-A 일곱난쟁이문제입니다
0
451
1
문제 풀 때 방향성에 대해
0
793
1
맥에서 vs code로 실행 관련 질문입니다
0
515
1
17071번 메모리 초과
0
381
1
1-C질문입니다!
0
411
2
2-B BFS 시간초과질문
0
623
2
1-O 13번 라인
0
435
1
6-J 놀이공원 문제 질문
0
376
1
구현관련 질문
0
479
1
강의 교안
0
313
1
실력을 더 올리고나서 강의를 보는 것이 맞을까요?
0
541
1
안녕하세요! 재귀함수에 관해서 질문드립니다
0
531
1
1-K
0
468
2
3-G번 질문있습니다.
1
464
3
3-C 실행 시간 질문드립니다.
0
489
1
4-A 문제 풀이 질문있습니다.
0
586
2
비트마스킹 연산자 "1의 보수" 영문 표기법
0
430
1
격자탐색 문제에서 BFS 시간복잡도 질문드립니다.
0
329
1
3-O go 함수 질문 드립니다.
1
437
2
4-A 출력 질문
0
299
1
1주차 1-O 질문드립니다
0
250
1

