문제
접근 방식
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;
public class Main_17143_정현명 {
public static class Shark{
int num;
int r;
int c;
int speed;
int dir;
int size;
public Shark(int num, int r, int c, int speed, int dir, int size) {
super();
this.num = num;
this.r = r;
this.c = c;
this.speed = speed;
this.dir = dir;
this.size = size;
}
}
static int R,C,M;
static HashMap<Integer,Shark> sharks;
static int[][] map;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
sharks = new HashMap<>();
map = new int[R+1][C+1];
for(int i=1;i<=M;i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int speed = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken());
int size = Integer.parseInt(st.nextToken());
map[r][c] = i;
sharks.put(i,new Shark(i,r,c,speed,dir,size));
}
System.out.println(go());
}
static int[] dr = {0,-1,1,0,0};
static int[] dc = {0,0,0,1,-1};
public static int go() {
int sizeSum = 0; // 낚시왕이 잡은 상어 크기 합
// 시뮬레이션 시작
for(int king=1;king<=C;king++) {
// 낚시왕 열 이동
// 낚시왕의 열에 있는 상어 탐색
for(int r=1;r<=R;r++) {
// 낚시왕이 있는 열에 가장 가까운 상어를 찾을 경우
if(map[r][king] != 0) {
// 해당 상어를 잡고 맵에서 없앤다.
sizeSum+= sharks.get(map[r][king]).size;
sharks.remove(map[r][king]);
map[r][king] = 0;
break;
}
}
for(int r=1;r<=R;r++) {
for(int c=1;c<=C;c++) {
map[r][c] = 0;
}
}
// 상어 이동
for(Shark shark : sharks.values()) {
int moveCnt = shark.speed;
// 상하로 이동하면
if(shark.dir<=2) moveCnt %= R*2-2;
// 좌우로 이동하면
else moveCnt %= C*2-2;
for(int move=0;move<moveCnt;move++) {
int nR = shark.r + dr[shark.dir];
int nC = shark.c + dc[shark.dir];
if(nR <1 || nR>R || nC<1 || nC>C) {
if(shark.dir == 1) shark.dir = 2;
else if(shark.dir == 2) shark.dir = 1;
else if(shark.dir == 3) shark.dir = 4;
else shark.dir = 3;
nR = shark.r + dr[shark.dir];
nC = shark.c + dc[shark.dir];
}
shark.r =nR;
shark.c =nC;
}
}
if(sharks.size() != 0) {
List<Integer> deleteList = new ArrayList<>();
for(Shark shark : sharks.values()) {
if(map[shark.r][shark.c] == 0) {
map[shark.r][shark.c]= shark.num;
}
else if(map[shark.r][shark.c]!= 0 ) {
if(sharks.get(map[shark.r][shark.c]).size < shark.size) {
deleteList.add(map[shark.r][shark.c]);
map[shark.r][shark.c] = shark.num;
}else {
deleteList.add(shark.num);
}
}
}
for(int i=0;i<deleteList.size();i++) {
sharks.remove(deleteList.get(i));
}
}
}
return sizeSum;
}
}