[백준] 19237 어른 상어
문제 설명
https://www.acmicpc.net/problem/19237
문제 풀이
- 시뮬레이션 문제이다.
- 문제 설명대로 구현하면 되며 각 조건을 어떻게 모델링할지가 중요했다.
- 빈 칸에 여러 마리 상어가 동시 접근하는 조건 유의 필요.
소스 코드 (JAVA)
import java.util.Scanner;
public class Main {
public static class Shark {
int x, y, d, live;
public Shark(int x, int y, int d, int live) {
this.x = x;
this.y = y;
this.d = d;
this.live = live;
}
}
public static int N, M, K;
public static Shark[] sharks = new Shark[401];
public static int[][][] sharkDir = new int[401][5][4];
public static int[][][] map = new int[20][20][2]; // 0: 냄새 번호, 1: 냄새 남은 시간
public static int[] dx = {0, -1, 1, 0, 0};
public static int[] dy = {0, 0, 0, -1, 1};
//끝났는지 확인
public static boolean isEnd() {
for (int i = 1; i <= M; i++) {
if ( i != 1 && sharks[i].live == 1)
return false;
}
return true;
}
//상어 이동
public static void sharkMove() {
for (int i = 1; i <= M; i++) {
//죽은 상어 제외
if (sharks[i].live == 0) continue;
//우선 순위에 따라 진행
int curDir = sharks[i].d;
boolean ExistEmpty = false;
//1. 빈칸 찾기
for (int j = 0; j < 4; j++) {
int X = sharks[i].x + dx[sharkDir[i][curDir][j]];
int Y = sharks[i].y + dy[sharkDir[i][curDir][j]];
if (X < 0 || Y < 0 || X >= N || Y >= N) continue;
//빈 칸이었으면
if (map[X][Y][0] == 0 || map[X][Y][1] == -1) {
ExistEmpty = true;
//다른 상어도 방금 들어왔을때 -> 현재 들어가는 상어 바로 죽임
if (map[X][Y][0] != 0) {
sharks[i].live = 0;
}
//그냥 빈칸일때 -> 들어가고 냄새남김
else {
map[X][Y][0] = i;
map[X][Y][1] = -1;
sharks[i].x = X;
sharks[i].y = Y;
sharks[i].d = sharkDir[i][curDir][j];
}
break;
}
}
//2. 내 냄새 찾기
if (ExistEmpty) continue;
for (int j = 0; j < 4; j++) {
int X = sharks[i].x + dx[sharkDir[i][curDir][j]];
int Y = sharks[i].y + dy[sharkDir[i][curDir][j]];
if (X < 0 || Y < 0 || X >= N || Y >= N) continue;
//내 냄새라면
if (map[X][Y][0] == i) {
map[X][Y][1] = K+1;
sharks[i].x = X;
sharks[i].y = Y;
sharks[i].d = sharkDir[i][curDir][j];
break;
}
}
}
//빈칸 부분 정상화
for (int a = 0; a < N; a++)
for (int b = 0; b < N; b++)
if (map[a][b][1] == -1) map[a][b][1] = K+1;
}
//냄새 시간 줄여주기
public static void smellProcess() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j][0] != 0) {
if (--map[i][j][1] == 0)
map[i][j][0] = 0;
}
}
}
}
//시뮬레이션 시작
public static void simulate() {
int result = 0;
//하루씩 늘려줌
while(true) {
result++;
if (result == 1001) {
System.out.println(-1);
return;
}
sharkMove();
if (isEnd()) {
System.out.println(result);
return;
}
smellProcess();
}
}
public static void input() {
Scanner sc = new Scanner(System.in);
N = sc.nextInt(); M = sc.nextInt(); K = sc.nextInt();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int num = sc.nextInt();
if (num == 0) continue;
sharks[num] = new Shark(i, j, 0, 1);
map[i][j][0] = num;
map[i][j][1] = K;
}
}
for (int i = 1; i <= M; i++)
sharks[i].d = sc.nextInt();
for (int i = 1; i <= M; i++) {
for (int j = 1; j <= 4; j++) {
for (int k = 0; k < 4; k++)
sharkDir[i][j][k] = sc.nextInt();
}
}
}
public static void main(String[] args) {
input();
simulate();
}
}
Author And Source
이 문제에 관하여([백준] 19237 어른 상어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ddongh1122/백준-19237-어른-상어저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)