반응형
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;
}
반응형
'알고리즘 > [ADV] 삼성 SW 역량 테스트 A형' 카테고리의 다른 글
[코드트리] 바이러스 백신 (삼성 SW 역량테스트 2019 상반기 오후 2번) (1) | 2024.06.08 |
---|---|
[코드트리] 격자 숫자 놀이 (삼성 SW 역량테스트 2019 상반기 오후 1번) (1) | 2024.06.08 |
[코드트리] 시공의 돌풍 (삼성 SW 역량테스트 2019 상반기 오전 1번) (0) | 2024.06.08 |
[코드트리] 전투 로봇 (삼성 SW 역량테스트 2018 하반기 오후 2번) (0) | 2024.06.08 |
[코드트리] 바이러스 실험 (삼성 SW 역량테스트 2018 하반기 오후 1번) (1) | 2024.06.08 |
댓글