본문 바로가기
알고리즘/[ADV] 삼성 SW 역량 테스트 A형

[코드트리] 바이러스 실험 (삼성 SW 역량테스트 2018 하반기 오후 1번)

by 피로물든딸기 2024. 6. 8.
반응형

삼성 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;
}
반응형

댓글