알고리즘/[ADV] 삼성 SW 역량 테스트 A형
[코드트리] 바이러스 실험 (삼성 SW 역량테스트 2018 하반기 오후 1번)
피로물든딸기
2024. 6. 8. 00:33
반응형
SW 역량테스트 합격하기 A형 강의 오픈!! (인프런 바로가기)
https://www.codetree.ai/training-field/frequent-problems/problems/virus-experiment
바이러스 실험 문제 풀이는 BOJ 16235 : 나무 재테크와 같다.
#include <stdio.h>
#define MAX (10 + 5)
int T;
int N, M, K;
int energy[MAX][MAX];
int A[MAX][MAX];
int virus[MAX][MAX][50000 + 50000];
int front[MAX][MAX];
int back[MAX][MAX];
int dr[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int dc[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
void input()
{
scanf("%d %d %d", &N, &M, &K);
for (int r = 1; r <= N; r++)
{
for (int c = 1; c <= N; c++)
{
scanf("%d", &A[r][c]);
energy[r][c] = 5;
}
}
for (int r = 1; r <= N; r++)
for (int c = 1; c <= N; c++)
front[r][c] = back[r][c] = 50000;
for (int i = 0; i < M; i++)
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
int& virusCount = back[x][y];
virus[x][y][virusCount++] = z;
}
}
void spring_summer()
{
for (int r = 1; r <= N; r++)
{
for (int c = 1; c <= N; c++)
{
int start = front[r][c];
int end = back[r][c];
int& fr = front[r][c];
int& bk = back[r][c];
int t;
for (t = start; t < end; t++)
{
if (virus[r][c][t] <= energy[r][c])
{
energy[r][c] -= virus[r][c][t];
virus[r][c][t]++;
fr++;
virus[r][c][bk++] = virus[r][c][t];
}
else
break;
}
for (; t < end; t++)
{
fr++;
energy[r][c] += (virus[r][c][t] / 2);
}
}
}
}
void autumn()
{
for (int r = 1; r <= N; r++)
{
for (int c = 1; c <= N; c++)
{
int start = front[r][c];
int end = back[r][c];
for (int t = start; t < end; t++)
{
if (virus[r][c][t] % 5 != 0) continue;
for (int i = 0; i < 8; i++)
{
int nr, nc;
nr = r + dr[i];
nc = c + dc[i];
if (nr < 1 || nc < 1 || nr > N || nc > N) continue;
int& virusFront = front[nr][nc];
virus[nr][nc][--virusFront] = 1;
}
}
}
}
}
void winter()
{
for (int r = 1; r <= N; r++)
for (int c = 1; c <= N; c++)
energy[r][c] += A[r][c];
}
int main(void)
{
// scanf("%d", &T);
T = 1;
for (int tc = 1; tc <= T; tc++)
{
input();
for (int time = 0; time < K; time++)
{
spring_summer();
autumn();
winter();
}
int ans = 0;
for (int r = 1; r <= N; r++)
for (int c = 1; c <= N; c++)
ans += back[r][c] - front[r][c];
printf("%d\n", ans);
}
return 0;
}
반응형