https://www.acmicpc.net/problem/17143
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int R,C,M, sum;
static Shark[][] map;
static List<Shark> list = new ArrayList<>();
// 상, 하 우, 좌
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,1,-1};
public static void main(String[] args) throws Exception {
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());
map = new Shark[R+1][C+1];
for(int i=0;i<M;i++){
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
int z = Integer.parseInt(st.nextToken());
Shark shark = new Shark(r, c, s, d-1, z);
list.add(shark);
map[r][c] = shark;
}
// solve
for (int i = 1; i <= C; i++) {
catchShark(i);
moveShark();
killShark();
}
System.out.println(sum);
}
static class Shark{
int r,c,s,d,z;
Shark(int r, int c, int s, int d, int z){
this.r=r; this.c=c; this.s=s;this.d=d; this.z=z;
}
}
static void catchShark(int col){
for(int i=1;i<=R;i++){
if(map[i][col] != null){
sum += map[i][col].z;
list.remove(map[i][col]);
break;
}
}
}
static void moveShark(){
for(Shark shark : list){
int r = shark.r;
int c = shark.c;
int s = shark.s;
int d = shark.d;
switch(d){
case 0:
case 1:
s %= (R-1)*2;
for(int i=0;i<s;i++){
if(r==1) d=1; // 상->하
else if(r==R) d=0; // 하->상
r+=dy[d];
}
shark.r=r;
shark.d=d;
break;
case 2:
case 3:
s %= (C-1)*2;
for(int i=0;i<s;i++){
if(c==1) d=2; // 좌->우
else if(c==C) d=3; // 우->좌
c+=dx[d];
}
shark.c=c;
shark.d=d;
break;
}
}
}
static void killShark(){
// map reset
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++){
map[i][j]=null;
}
}
int size = list.size();
for(int i=size-1;i>=0;i--){
Shark s = list.get(i);
if(map[s.r][s.c] == null){
map[s.r][s.c] = s;
} else if (map[s.r][s.c].z < s.z) {
list.remove(map[s.r][s.c]);
map[s.r][s.c] = s;
} else{
list.remove(s);
}
}
}
}