Skip to content

Commit 0370aec

Browse files
authored
[백준 20061] 모노미노도미노 2 - 시뮬레이션
1 parent 71438ba commit 0370aec

File tree

1 file changed

+265
-0
lines changed

1 file changed

+265
-0
lines changed

hoseok/week36/Boj20061.java

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,265 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
class Main {
5+
6+
static class Node {
7+
int r, c;
8+
9+
Node(int r, int c) {
10+
this.r = r;
11+
this.c = c;
12+
}
13+
}
14+
15+
static boolean[][] blueMap = new boolean[4][6];
16+
static boolean[][] greenMap = new boolean[6][4];
17+
static int score;
18+
19+
public static void main(String[] args) throws Exception {
20+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
21+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
22+
int n = Integer.parseInt(br.readLine());
23+
24+
while (n-- > 0) {
25+
StringTokenizer st = new StringTokenizer(br.readLine());
26+
int t = Integer.parseInt(st.nextToken());
27+
int x = Integer.parseInt(st.nextToken());
28+
int y = Integer.parseInt(st.nextToken());
29+
30+
// 모든 블록을 가져오고
31+
Node[] nodes = getBlock(t, x, y);
32+
// 파란 보드에 채움
33+
fillBlueMap(t, nodes);
34+
// 빨간 보드에 채움
35+
fillGreenMap(t, nodes);
36+
// 점수를 계산함
37+
calculateBlueMap();
38+
calculateGreenMap();
39+
40+
// 연한 색상에 있는경우 칸의 수만큼 삭제해야함
41+
deleteBrightBlueMap();
42+
deleteBrightGreenMap();
43+
44+
}
45+
int count = 0;
46+
for (int i = 5; i >= 2; i--) {
47+
for (int j = 0; j <= 3; j++) {
48+
if (blueMap[j][i]) {
49+
count++;
50+
}
51+
if (greenMap[i][j]) {
52+
count++;
53+
}
54+
}
55+
}
56+
57+
bw.write(score + "\n" + count);
58+
bw.flush();
59+
bw.close();
60+
}
61+
62+
public static void deleteBrightGreenMap() {
63+
int count = 0;
64+
for (int r = 0; r <= 1; r++) {
65+
for (int c = 0; c <= 3; c++) {
66+
// 밝은 영역에 하나의 열이라도 차지하고 있다면 오른쪽으로 당겨주어야 함
67+
if (greenMap[r][c]) {
68+
count++;
69+
break;
70+
}
71+
}
72+
}
73+
// 차지한 행의 개수만큼 아래로 당겨주어야 함
74+
while (count-- > 0) {
75+
pullDown(5);
76+
}
77+
}
78+
79+
public static void deleteBrightBlueMap() {
80+
int count = 0;
81+
for (int c = 0; c <= 1; c++) {
82+
for (int r = 0; r <= 3; r++) {
83+
// 밝은 영역에 하나의 열이라도 차지하고 있다면 오른쪽으로 당겨주어야 함
84+
if (blueMap[r][c]) {
85+
count++;
86+
break;
87+
}
88+
}
89+
}
90+
// 차지한 열의 개수만큼 우측 끝에서 당겨주어야 함
91+
while (count-- > 0) {
92+
pullRight(5);
93+
}
94+
}
95+
96+
public static void calculateGreenMap() {
97+
for (int r = 5; r >= 0; r--) {
98+
int count = 0;
99+
for (int c = 0; c <= 3; c++) {
100+
if (greenMap[r][c]) {
101+
count++;
102+
}
103+
}
104+
if (count == 4) {
105+
score++;
106+
popGreenMap(r);
107+
pullDown(r);
108+
r++;
109+
}
110+
}
111+
}
112+
113+
public static void pullDown(int row) {
114+
for (int r = row; r >= 0; r--) {
115+
for (int c = 0; c <= 3; c++) {
116+
// 당겨올때 0열이면 false으로 채워야 함
117+
if (r == 0) {
118+
greenMap[r][c] = false;
119+
} else {
120+
// 한칸씩 당겨오기
121+
greenMap[r][c] = greenMap[r - 1][c];
122+
}
123+
}
124+
}
125+
}
126+
127+
public static void popGreenMap(int row) {
128+
for (int i = 0; i <= 3; i++) {
129+
greenMap[row][i] = true;
130+
}
131+
}
132+
133+
public static void calculateBlueMap() {
134+
for (int c = 5; c >= 0; c--) {
135+
int count = 0;
136+
for (int r = 0; r <= 3; r++) {
137+
if (blueMap[r][c]) {
138+
count++;
139+
}
140+
}
141+
if (count == 4) {
142+
score++;
143+
popBlueMap(c);
144+
pullRight(c);
145+
c++; // 한칸씩 당겼으므로 현재위치 재 탐색
146+
}
147+
}
148+
}
149+
150+
public static void pullRight(int col) {
151+
for (int c = col; c >= 0; c--) {
152+
for (int r = 0; r <= 3; r++) {
153+
// 당겨올때 0열이면 false으로 채워야 함
154+
if (c == 0) {
155+
blueMap[r][c] = false;
156+
} else {
157+
// 한칸씩 당겨오기
158+
blueMap[r][c] = blueMap[r][c - 1];
159+
}
160+
}
161+
162+
}
163+
}
164+
165+
public static void popBlueMap(int col) {
166+
for (int i = 0; i <= 3; i++) {
167+
blueMap[i][col] = false;
168+
}
169+
170+
}
171+
172+
public static void fillGreenMap(int t, Node[] nodes) {
173+
for (int r = 5; r >= 0; r--) {
174+
if (canFillGreenMap(r, t, nodes)) {
175+
fillGreen(r, t, nodes);
176+
break;
177+
}
178+
}
179+
}
180+
181+
public static boolean canFillGreenMap(int row, int t, Node[] nodes) {
182+
for (int r = row; r >= 0; r--) {
183+
if (t == 1) {
184+
// 채우려는 공간에 하나라도 차있으면
185+
if (greenMap[r][nodes[0].c]) {
186+
return false;
187+
}
188+
} else if (t == 2) {
189+
if (greenMap[r][nodes[0].c] || greenMap[r][nodes[1].c]) {
190+
return false;
191+
}
192+
} else if (t == 3 && r > 0) {
193+
if (greenMap[r][nodes[0].c] || greenMap[r - 1][nodes[0].c]) {
194+
return false;
195+
}
196+
}
197+
}
198+
return true;
199+
}
200+
201+
public static void fillGreen(int row, int t, Node[] nodes) {
202+
// 1 X 1
203+
if (t == 1) {
204+
greenMap[row][nodes[0].c] = true;
205+
} else if (t == 2) { // 1 X 2
206+
greenMap[row][nodes[0].c] = true;
207+
greenMap[row][nodes[1].c] = true;
208+
} else {
209+
greenMap[row][nodes[0].c] = true;
210+
greenMap[row - 1][nodes[0].c] = true;
211+
}
212+
}
213+
214+
public static void fillBlueMap(int t, Node[] nodes) {
215+
for (int c = 5; c >= 0; c--) {
216+
if (canFillBlueMap(c, t, nodes)) {
217+
fillBlue(c, t, nodes);
218+
break;
219+
}
220+
}
221+
}
222+
223+
public static boolean canFillBlueMap(int col, int t, Node[] nodes) {
224+
for (int c = col; c >= 0; c--) {
225+
if (t == 1) {
226+
// 채우려는 공간에 하나라도 차있으면
227+
if (blueMap[nodes[0].r][c]) {
228+
return false;
229+
}
230+
} else if (t == 2 && c > 0) {
231+
if (blueMap[nodes[1].r][c] || blueMap[nodes[1].r][c - 1]) {
232+
return false;
233+
}
234+
} else {
235+
if (blueMap[nodes[0].r][c] || blueMap[nodes[1].r][c]) {
236+
return false;
237+
}
238+
}
239+
}
240+
return true;
241+
}
242+
243+
public static void fillBlue(int col, int t, Node[] nodes) {
244+
// 1 X 1 블록을 채울때
245+
if (t == 1) {
246+
blueMap[nodes[0].r][col] = true;
247+
} else if (t == 2) { // 1 X 2
248+
blueMap[nodes[1].r][col] = true;
249+
blueMap[nodes[1].r][col - 1] = true;
250+
} else { // 2 X 1
251+
blueMap[nodes[0].r][col] = true;
252+
blueMap[nodes[1].r][col] = true;
253+
}
254+
}
255+
256+
public static Node[] getBlock(int t, int x, int y) {
257+
if (t == 1) {
258+
return new Node[]{new Node(x, y)};
259+
}
260+
if (t == 2) {
261+
return new Node[]{new Node(x, y), new Node(x, y + 1)};
262+
}
263+
return new Node[]{new Node(x, y), new Node(x + 1, y)};
264+
}
265+
}

0 commit comments

Comments
 (0)