Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e7dd7a7

Browse files
committed
이예진: [CT] 생명과학부_랩_인턴_241125
1 parent 8252d54 commit e7dd7a7

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /