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

[코드트리] 청소는 즐거워 (삼성 SW 역량테스트 2020 하반기 오후 1번)

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

 

SW 역량테스트 합격하기 A형 강의 오픈!! (인프런 바로가기)

 

삼성 A형 전체 링크

 

https://www.codetree.ai/training-field/frequent-problems/problems/cleaning-is-joyful

이후 설명 및 입/출력은 링크 참고

 

청소는 즐거워 문제 풀이BOJ 20057 : 마법사 상어와 토네이도와 같다.

#include <stdio.h>

#define MAX (500 + 20)

int T;
int N;
int MAP[MAX][MAX];

void input()
{
	scanf("%d", &N);

	for (int r = 0; r < N; r++)
		for (int c = 0; c < N; c++)
			scanf("%d", &MAP[r][c]);
}

/* 순서대로 왼쪽, 아래, 오른쪽, 위 */
int dr[] = { 0, 1, 0, -1 };
int dc[] = { -1, 0, 1, 0 };

int ratio[9] = { 2, 10, 7, 1, 5, 10, 7, 1, 2 };

int moveR[4][10] =
{
	{ -2, -1, -1, -1,  0,  1,  1,  1,  2,  0 },
	{  0,  1,  0, -1,  2,  1,  0, -1,  0,  1 },
	{ -2, -1, -1, -1,  0,  1,  1,  1,  2,  0 },
	{  0, -1,  0,  1, -2, -1,  0,  1,  0, -1 }
};

int moveC[4][10] =
{
	{  0, -1,  0,  1, -2, -1,  0,  1,  0, -1 },
	{ -2, -1, -1, -1,  0,  1,  1,  1,  2,  0 },
	{  0,  1,  0, -1,  2,  1,  0, -1,  0,  1 },
	{ -2, -1, -1, -1,  0,  1,  1,  1,  2,  0 }
};

int moveDust(int r, int c, int dir)
{
	int ret, pos, dust;

	ret = 0, pos = MAP[r][c];
	for (int i = 0; i < 10; i++)
	{
		if (i == 9) dust = MAP[r][c]; /* 남아 있는 모래를 a로 이동 */
		else
		{
			dust = pos * ratio[i] / 100;
			MAP[r][c] -= dust;
		}

		int nr, nc;

		nr = r + moveR[dir % 4][i];
		nc = c + moveC[dir % 4][i];

		if (nr < 0 || nr > N - 1 || nc < 0 || nc > N - 1) ret += dust;
		else MAP[nr][nc] += dust;
	}

	return ret;
}

int simulate()
{
	int outDust, dir, sr, sc, count;

	sr = sc = N / 2;
	outDust = dir = 0; /* 방향은 왼쪽부터 시작 */

	count = 1;
	for (int i = 0; i < N; i++)
	{
		for (int k = 0; k < count; k++)
		{
			sr += dr[dir % 4];
			sc += dc[dir % 4];

			outDust += moveDust(sr, sc, dir);
		}

		dir++;

		for (int k = 0; k < count; k++)
		{
			sr += dr[dir % 4];
			sc += dc[dir % 4];

			outDust += moveDust(sr, sc, dir);
		}

		dir++;
		count++;
	}

	sr += dr[dir % 4];
	sc += dc[dir % 4];

	outDust += moveDust(sr, sc, dir);

	return outDust;
}

int main(void)
{
	// scanf("%d", &T);
	T = 1;
	for (int tc = 1; tc <= T; tc++)
	{
		input();

		printf("%d\n", simulate());
	}
    
	return 0;
}
반응형

댓글