1
+ import java .io .*;
2
+ import java .util .*;
3
+
4
+ //2 ≤ n, m ≤ 100 > 10^4
5
+ public class YJ_생명과학부_랩_인턴 {
6
+ static class Mold {
7
+ int x ;
8
+ int y ;
9
+ int s ; //이동거리
10
+ int d ; //이동방향
11
+ int b ; //곰팡이 크기
12
+
13
+ Mold (int x , int y , int s , int d , int b ){
14
+ this .x = x ;
15
+ this .y = y ;
16
+ this .s = calculateS (s ,d );
17
+ this .d = d ;
18
+ this .b = b ;
19
+ }
20
+
21
+ private int calculateS (int s , int d ){
22
+ if (d <=1 ){
23
+ return s % (2 *n -2 );
24
+ }else {
25
+ return s % (2 *m -2 );
26
+ }
27
+ }
28
+
29
+ public void changeD (){
30
+ //위(1)↔아래(2) , 오른쪽(3)↔왼쪽(4)
31
+ this .d = this .d %2 == 0 ? this .d +1 : this .d -1 ;
32
+ }
33
+
34
+ public boolean isBiggerThan (Mold m ){
35
+ if (Objects .isNull (m )){
36
+ return true ;
37
+ }
38
+ return this .b > m .b ;
39
+ }
40
+ }
41
+
42
+ static Mold [][] lab ;
43
+ static List <Mold > inventory = new ArrayList <>(); //인턴이 채취한 곰팡이들
44
+ static int n ;
45
+ static int m ;
46
+ public static void main (String [] args ) throws IOException {
47
+ BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
48
+ StringTokenizer st = new StringTokenizer (br .readLine ());
49
+ n = Integer .parseInt (st .nextToken ());
50
+ m = Integer .parseInt (st .nextToken ());
51
+ int k = Integer .parseInt (st .nextToken ());
52
+
53
+ if (k == 0 ){
54
+ System .out .println (0 );
55
+ }else {
56
+ lab = new Mold [n ][m ];
57
+ for (int i =0 ; i <k ; i ++){
58
+ st = new StringTokenizer (br .readLine ());
59
+ int x = Integer .parseInt (st .nextToken ());
60
+ int y = Integer .parseInt (st .nextToken ());
61
+ int s = Integer .parseInt (st .nextToken ());
62
+ int d = Integer .parseInt (st .nextToken ());
63
+ int b = Integer .parseInt (st .nextToken ());
64
+ lab [x -1 ][y -1 ] = new Mold (x -1 ,y -1 ,s ,d -1 ,b );
65
+ }
66
+
67
+ //모든 열 검사
68
+ for (int i =0 ; i <m ; i ++){
69
+ search (i );
70
+ moveMolds ();
71
+ }
72
+ //인턴이 채취한 곰팡9이 크기
73
+ System .out .println (inventory .stream ().mapToInt (mold -> mold .b ).sum ());
74
+ }
75
+ }
76
+
77
+ //곰팡이 채취하기
78
+ //열의 위에서 아래로 내려가며 탐색할 때 제일 빨리 발견한 곰팡이를 채취
79
+ public static void search (int j ){
80
+ for (int i =0 ; i <n ; i ++){
81
+ Mold mold = lab [i ][j ];
82
+ if (!Objects .isNull (mold )){
83
+ inventory .add (mold );
84
+ lab [i ][j ] = null ;
85
+ break ;
86
+ }
87
+ }
88
+ }
89
+
90
+ //곰팡이 이동
91
+ public static void moveMolds (){
92
+ Mold [][] tempLab = new Mold [n ][m ];
93
+ for (int i =0 ; i <n ; i ++){
94
+ for (int j =0 ; j <m ; j ++){
95
+ Mold mold = lab [i ][j ];
96
+ if (Objects .isNull (mold )){
97
+ continue ;
98
+ }
99
+ Mold movedMold = move (mold ); //곰팡이 움직이기
100
+ //기존 곰팡이보다 더 클 경우 기존 곰팡이 제거
101
+ if (movedMold .isBiggerThan (tempLab [movedMold .x ][movedMold .y ])){
102
+ tempLab [movedMold .x ][movedMold .y ] = movedMold ;
103
+ }
104
+ }
105
+ }
106
+ //tempLab > lab 으로 옮기기 : 기존의 lab 에서 곰팡이를 이동시키면 중복 이동이 발생할 수도 있음
107
+ lab = tempLab ;
108
+ }
109
+
110
+ private static Mold move (Mold mold ){
111
+ //위 아래 오른쪽 왼쪽
112
+ int [] nx = {-1 ,1 ,0 ,0 };
113
+ int [] ny = {0 ,0 ,1 ,-1 };
114
+ //거리만큼 이동
115
+ int tempS = mold .s ;
116
+ while (tempS -- > 0 ){
117
+ int x = mold .x + nx [mold .d ];
118
+ int y = mold .y + ny [mold .d ];
119
+ //격자 범위를 벗어날 경우 방향전환
120
+ if (x < 0 || y < 0 || x >= n || y >= m ){
121
+ mold .changeD ();
122
+ mold .x = mold .x + nx [mold .d ];
123
+ mold .y = mold .y + ny [mold .d ];
124
+ }else { //격자 범위 내일 경우 그대로 이동
125
+ mold .x = x ;
126
+ mold .y = y ;
127
+ }
128
+ }
129
+ return mold ;
130
+ }
131
+ }
0 commit comments