BOJ 16236

아기상어

문제출처

문제 해석

  • NxN공간에서 아기상어가 몇초동안 물고기를 잡아먹을 수 있는 지 구하는 문제입니다.
  • 아기상어의 초기 크기는 2이고, 1초에 상하좌우로 이동합니다.
  • 자신보다 큰 물고기를 제외하고 지나갈 수 있으며, 작은 물고기만 먹을 수 있습니다.
  • 최소거리 > 가장 위 > 가장 왼쪽 을 만족하는 물고기를 먼저 먹습니다.
  • 자신의 크기와 같은 수만큼 물고기를 먹으면 크기가 1 증가합니다.

설계(10)

  • 우선순위를 고려해야 하기 때문에 우선순위 큐를 사용합니다.
  • bfs탐색을 하여 자신의 크기보다 작은 물고기를 찾습니다.
  • 만족하는 물고기를 찾으면 거리를 갱신하고, 큐와 방문여부를 초기화한 후 해당 좌표부터 다시 시작합니다.

구현(30)

코드
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define MAXN 20

struct info {
	int x;
	int y;
	int dist;
	bool operator < (const info& a) const {
		if (a.dist <= dist) {
			if (a.dist == dist) {
				if (a.x <= x) {
					if (a.x == x) {
						return a.y < y;
					}
					return true;
				}
				return false;
			}
			return true;
		}
		return false;
	}
};
struct node {
	int x;
	int y;
	int size;
	int cnt;
} shark;
priority_queue<info> pq;

bool visited[MAXN][MAXN];
int map[MAXN][MAXN];
int N;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
int bfs() {
	int time = 0;
	
	while (!pq.empty()) {
		int x = pq.top().x;
		int y = pq.top().y;
		int cnt = pq.top().dist;
		if (map[x][y]!= 0 && map[x][y] < shark.size) {
			
			time += cnt;
			map[x][y] = 0;
			if (shark.size == ++shark.cnt) {
				shark.size++;
				shark.cnt = 0;
			}
			memset(visited, false, sizeof(visited));
			while (!pq.empty()) pq.pop();
			pq.push({ x,y,0 });
			visited[x][y] = true;
			continue;
		}
		pq.pop();
		for (int k = 0; k < 4; k++) {
			int nx = x + dx[k];
			int ny = y + dy[k];
			if (nx < 0 || ny < 0 || nx >= N || ny >= N)continue;
			if (visited[nx][ny]) continue;

			if (shark.size >= map[nx][ny]) {
				visited[nx][ny] = true;
				pq.push({nx,ny,cnt+1});
			}
		}
	}
	return time;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> map[i][j];
			if (map[i][j] == 9) {
				map[i][j] = 0;
				shark = { i,j,2,0 };
				pq.push({ i,j, 0});
				visited[i][j] = true;
			}
		}
	}
	cout << bfs() << "\n";
	return 0;
}
디버깅
제출결과
  • 0ms

마무리

  • 우선순위 큐를 이용하여 bfs탐색하는 문제입니다. 우선순위를 만족하도록 comparator만 잘 구현해주면 될 것 같습니다.