굥뷰를 햡시댜

[BOJ-16236] 아기상어 본문

알고리즘 문제 풀이/BOJ 문제 풀이

[BOJ-16236] 아기상어

GodZ 2019. 7. 18. 21:13

https://www.acmicpc.net/problem/16236

 

16236번: 아기 상어

N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가지고 있고, 이 크기는 자연수이다. 가장 처음에 아기 상어의 크기는 2이고, 아기 상어는 1초에 상하좌우로 인접한 한 칸씩 이동한다. 아기 상어는 자신의 크기보다 큰 물고기가 있는 칸은 지나갈 수 없고, 나머지 칸은 모두 지나갈 수 있다. 아기 상어는 자신의 크

www.acmicpc.net

 

2019년 하반기 모 기업의 코딩테스트 문제 입니다.

 

'거리가 가장 가까운 물고기를 먹는데 거리가 같을 경우 가장 위에 있는 물고기, 그러한 물고기가 여러마리라면 가장 왼쪽에 있는 물고기를 먹는다' 이 부분을 구현하는 것에서 생각을 많이 했던 문제입니다.

 

이 부분을 제외하고는 bfs로 탐색하며 상어의 크기보다 작은 물고기를 찾아서 큐에 넣어주면서 반복하면 되고, 먹을 물고기를 찾았을 때 물고기를 먹고 상어의 크기만큼 물고기를 먹었을 때, 상어의 크기를 1 증가시켜주면 됩니다.

 

위에 언급했던 것 말고는 구현하는데 큰 어려움을 겪은 것은 없었고 개인적으로, 전에 포스팅했던 인구이동 문제보다는 조금 쉬운 문제였던것 같습니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <queue>

using namespace std;

struct SHARK {
	int y, x, time;
};
int n, res;
int shark_size = 2, eat_shark;
int map[20][20];
const int dy[] = { -1,1,0,0 };
const int dx[] = { 0,0,-1,1 };
SHARK shark;

int main(void) {

	scanf("%d", &n);

	for (int y = 0; y < n; y++) {
		for (int x = 0; x < n; x++) {
			scanf("%d", &map[y][x]);

			if (map[y][x] == 9) {
				shark.y = y, shark.x = x, shark.time = 0;
				map[y][x] = 0;
			}
		}
	}

	bool flag = true;

	while (flag) {
		flag = false;

		bool visited[20][20] = { 0, };

		visited[shark.y][shark.x] = 1;
		queue<SHARK> q;
		q.push(shark);
		
		SHARK candi;

		candi.y = 22, candi.time = 0x7fffffff;

		while (!q.empty()) {
			SHARK cur = q.front(); q.pop();

			for (int dir = 0; dir < 4; dir++) {
				SHARK next;

				next.y = cur.y + dy[dir];
				next.x = cur.x + dx[dir];
				next.time = cur.time + 1;

				if (next.y < 0 || next.y >= n || next.x < 0 || next.x >= n) continue;
				if (visited[next.y][next.x] == 0 && map[next.y][next.x] <= shark_size) {

					if (map[next.y][next.x] < shark_size) {
						if (map[next.y][next.x] != 0 && next.time < candi.time) {
							flag = true;
							candi = next;
						}
						else if (map[next.y][next.x] != 0 && next.time == candi.time) {
							if (next.y < candi.y || (candi.y == next.y && candi.x > next.x)) {
								flag = true;
								candi = next;
							}
						}
					}

					visited[next.y][next.x] = 1;
					q.push(next);
				}
			}
		}

		if (flag) {
			eat_shark += 1;
			shark = candi;
			map[shark.y][shark.x] = 0;

			if (eat_shark == shark_size) {
				shark_size += 1;
				eat_shark = 0;
			}
		}
	}

	printf("%d\n", shark.time);

	getchar();
	getchar();

	return 0;
}

 

'알고리즘 문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ-14503] 로봇청소기  (0) 2019.07.26
[BOJ-17070] 파이프 옮기기1  (0) 2019.07.19
[BOJ-16234] 인구이동  (0) 2019.07.17
[BOJ-17140] 낚시왕  (0) 2019.07.15
[BOJ-4673] 셀프 넘버  (0) 2019.07.15
Comments