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

[코드트리] 생명과학부 랩 인턴 (삼성 SW 역량테스트 2019 상반기 오전 2번)

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

삼성 A형 전체 링크

 

https://www.codetree.ai/training-field/frequent-problems/problems/biology-lab-intern

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

 

생명과학부 랩 인턴 문제 풀이BOJ 17143 : 낚시왕과 같다.

#include <stdio.h>

#define MAX (100 + 20)

int T;
int R, C, M;

typedef struct st
{
	int speed;
	int dir;
	int size;
}MOLD;

MOLD mold[MAX][MAX];

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

void input()
{
	scanf("%d %d %d", &R, &C, &M);

	for (int i = 0; i < MAX; i++)
		for (int k = 0; k < MAX; k++)
			mold[i][k].speed = mold[i][k].dir = mold[i][k].size = 0;

	for (int i = 0; i < M; i++)
	{
		int r, c, s, d, z;

		scanf("%d %d %d %d %d", &r, &c, &s, &d, &z);

		mold[r][c].speed = s;
		mold[r][c].dir = d;
		mold[r][c].size = z;
	}
}

void output()
{
	for (int r = 1; r <= R; r++)
	{
		for (int c = 1; c <= C; c++)
			printf("%d ", mold[r][c].size);
		putchar('\n');
	}
	putchar('\n');
}


int catchMold(int c)
{
	for (int r = 1; r <= R; r++)
	{
		if (mold[r][c].size)
		{
			int ret = mold[r][c].size;

			/* 낚시왕이 있는 열에 있는 상어 중에서 땅과 제일 가까운 상어를 잡는다.
			상어를 잡으면 격자판에서 잡은 상어가 사라진다. */
			mold[r][c].size = 0;

			return ret;
		}
	}

	return 0; /* 상어가 없는 경우는 0을 return */
}

void moveShark()
{
	int changeDir[5] = { 0, 2, 1, 4, 3 };
	MOLD tmpMold[MAX][MAX] = {};

	for (int r = 1; r <= R; r++)
	{
		for (int c = 1; c <= C; c++)
		{
			if (mold[r][c].size == 0) continue;

			MOLD md = mold[r][c];

			if (md.dir <= 2) /* 위나 아래의 경우 */
			{
				int move = md.speed;
				int sr, dir;

				sr = r;
				dir = md.dir;

				for (int m = 0; m < move; m++)
				{
					int nr;

					nr = sr + dr[dir];

					if (nr < 1)
					{
						dir = changeDir[dir];
						sr = 2;
						continue;
					}

					if (nr > R)
					{
						dir = changeDir[dir];
						sr = R - 1;
						continue;
					}

					sr = nr;
				}

				if (tmpMold[sr][c].size < mold[r][c].size)
				{
					tmpMold[sr][c] = mold[r][c];
					tmpMold[sr][c].dir = dir;
				}
			}
			else /* 오른쪽이나 왼쪽의 경우 */
			{
				int move = md.speed;
				int sc, dir;

				sc = c;
				dir = md.dir;

				for (int m = 0; m < move; m++)
				{
					int nc;

					nc = sc + dc[dir];

					if (nc < 1)
					{
						dir = changeDir[dir];
						sc = 2;
						continue;
					}

					if (nc > C)
					{
						dir = changeDir[dir];
						sc = C - 1;
						continue;
					}

					sc = nc;
				}

				if (tmpMold[r][sc].size < mold[r][c].size)
				{
					tmpMold[r][sc] = mold[r][c];
					tmpMold[r][sc].dir = dir;
				}
			}
		}
	}

	for (int r = 1; r <= R; r++)
		for (int c = 1; c <= C; c++)
			mold[r][c] = tmpMold[r][c];
}

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

		input();

		ans = 0;
		for (int c = 1; c <= C; c++) /* 1. 낚시왕이 오른쪽으로 한 칸 이동한다. */
		{
			ans += catchMold(c); /* 2. 상어를 잡는다. */
			moveShark(); /* 3. 상어가 이동한다. */
			//output();
		}

		printf("%d\n", ans);
	}

	return 0;
}
반응형

댓글