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 662bd32

Browse files
Merge pull request #234 from GreatAlgorithm-Study/xubin
[17주차] 배수빈
2 parents 3d1662c + d864011 commit 662bd32

File tree

8 files changed

+518
-0
lines changed

8 files changed

+518
-0
lines changed

‎BOJ/1000-5000번/SB_1765.java‎

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.HashSet;
5+
import java.util.Set;
6+
import java.util.StringTokenizer;
7+
8+
public class SB_1765 {
9+
static int N, M;
10+
static int[] team, enemy;
11+
12+
private static int find(int x) {
13+
if (team[x]!=x) team[x] = find(team[x]);
14+
return team[x];
15+
}
16+
17+
private static void union(int a, int b) {
18+
int pa = find(a);
19+
int pb = find(b);
20+
if (pa < pb) team[pb] = pa;
21+
else if (pb < pa) team[pa] = pb;
22+
}
23+
24+
private static void makeRelation(char op, int p, int q) {
25+
int pp = find(p);
26+
int pq = find(q);
27+
28+
if (pp == pq) return;
29+
30+
if (op=='F'){ // 친구일 경우 팀 병합
31+
union(pp, pq);
32+
33+
// 팀 병합에 따른 원수 관계 병합
34+
if (enemy[pp] != 0 && enemy[pq] != 0) union(enemy[pp], enemy[pq]); // 두 팀 모두 원수가 있으면 각 원수들끼리 친구 시키기
35+
36+
// 한 쪽만 원수 있으면 같이 원수 만들기
37+
else if (enemy[pp]!=0) enemy[pq] = find(enemy[pp]);
38+
else if(enemy[pq]!=0) enemy[pp] = find(enemy[pq]);
39+
}
40+
else { // 원수일 경우, 각 팀의 원수를 상대랑 친구시키기
41+
if (enemy[pp]==0) enemy[pp] = pq; // pp의 원수가 없으면 pp의 원수는 바로 pq의 원수가 됨
42+
else union(enemy[pp], pq); // pp의 원수가 있으면 pp의 원수랑 pq랑 친구가 됨
43+
44+
if (enemy[pq]==0) enemy[pq] = pp; // 원수가 없으면 상대의 원수를 같이 원수로 받아드리고
45+
else union(enemy[pq], pp); // 원수가 있으면 나의 원수와 상대가 친구가됨
46+
}
47+
}
48+
49+
public static void main(String[] args) throws IOException {
50+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
51+
StringTokenizer st;
52+
N = Integer.parseInt(br.readLine());
53+
M = Integer.parseInt(br.readLine());
54+
55+
// 팀 초기화
56+
team = new int[N + 1];
57+
for (int i = 0; i < N + 1; i++) {
58+
team[i] = i;
59+
}
60+
enemy = new int[N + 1];
61+
62+
for (int i = 0; i < M; i++) {
63+
st = new StringTokenizer(br.readLine());
64+
char op = st.nextToken().charAt(0);
65+
int p = Integer.parseInt(st.nextToken());
66+
int q = Integer.parseInt(st.nextToken());
67+
68+
makeRelation(op, p, q);
69+
}
70+
71+
72+
// 부모 재정비
73+
for (int i = 1; i <= N; i++) find(i);
74+
75+
Set<Integer> ans = new HashSet<>();
76+
for (int i = 1; i < N + 1; i++) {
77+
ans.add(find(i));
78+
}
79+
System.out.println(ans.size());
80+
}
81+
}

‎BOJ/1000-5000번/SB_3109.java‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.StringTokenizer;
5+
6+
public class SB_3109 {
7+
static int R, C;
8+
static char[][] board;
9+
static boolean[][] visited;
10+
static int[] dx = {-1, 0, 1};
11+
static int[] dy = {1, 1, 1};
12+
13+
private static boolean backtracking(int r, int c) {
14+
if (c == C - 1) return true;
15+
16+
for (int i = 0; i < 3; i++) {
17+
int nr = r + dx[i];
18+
int nc = c + dy[i];
19+
if (!isValid(nr, nc) || board[nr][nc]=='x' || visited[nr][nc]) continue;
20+
visited[nr][nc] = true;
21+
if (backtracking(nr, nc)) return true; // 그냥 함수값을 바로 리턴하면 실패했을때 더 못돌아봄
22+
}
23+
return false;
24+
}
25+
26+
private static boolean isValid(int x, int y) {
27+
return 0 <= x && x < R && 0 <= y && y < C;
28+
}
29+
public static void main(String[] args) throws IOException {
30+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
31+
StringTokenizer st = new StringTokenizer(br.readLine());
32+
R = Integer.parseInt(st.nextToken());
33+
C = Integer.parseInt(st.nextToken());
34+
35+
board = new char[R][C];
36+
visited = new boolean[R][C];
37+
for (int i = 0; i < R; i++) {
38+
String line = br.readLine();
39+
for (int j = 0; j < C; j++) {
40+
board[i][j] = line.charAt(j);
41+
}
42+
}
43+
44+
int ans = 0;
45+
for (int r = 0; r < R; r++) {
46+
if(backtracking(r, 0)) ans++;
47+
}
48+
System.out.println(ans);
49+
}
50+
}

‎BOJ/20001-25000번/SB_20061.java‎

Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.Arrays;
5+
import java.util.StringTokenizer;
6+
7+
public class SB_20061 {
8+
static boolean[][] bBoard = new boolean[4][6];
9+
static boolean[][] gBoard = new boolean[6][4];
10+
static int ans = 0;
11+
12+
private static void putBlueBlock(Block b) {
13+
// 행 고정, 열 움직이기
14+
int targetCol = -1;
15+
for (int c = 0; c < 6; c++) {
16+
boolean canPlace = true;
17+
for (int i = 0; i < b.sr; i++) { // 블럭의 세로 크기만큼 확인
18+
for (int j = 0; j < b.sc; j++) { // 블럭의 가로 크기만큼 확인
19+
if (c + j > 5 || bBoard[b.r + i][c + j]) { // 블럭을 놓을 수 없을 경우(범위 벗어나거나 겹침)
20+
canPlace = false;
21+
break;
22+
}
23+
}
24+
if (!canPlace) break; // 현재 행 불가능이면 끝
25+
}
26+
27+
if (canPlace) targetCol = c; // 현재 위치가 블록을 놓을 수 있으면 targetCol 최신 현재 위치로 업데이트
28+
else break; // 블록을 더이상 못놓으면 탈출
29+
}
30+
31+
// 블록을 targetCol에 놓기
32+
if (targetCol != -1) {
33+
for (int i = 0; i < b.sr; i++) {
34+
for (int j = 0; j < b.sc; j++) {
35+
bBoard[b.r + i][targetCol + j] = true;
36+
}
37+
}
38+
}
39+
}
40+
41+
private static void putGreenBlock(Block b) {
42+
// 열 고정, 행 움직이기
43+
int targetRow = -1;
44+
for (int r = 0; r < 6; r++) {
45+
boolean canPlace = true;
46+
for (int i = 0; i < b.sr; i++) {
47+
for (int j = 0; j < b.sc; j++) {
48+
if (r + i > 5 || gBoard[r + i][b.c + j]) {
49+
canPlace = false;
50+
break;
51+
}
52+
}
53+
if (!canPlace) break;
54+
}
55+
if (canPlace) targetRow = r;
56+
else break;
57+
}
58+
59+
if (targetRow != -1) {
60+
for (int i = 0; i < b.sr; i++) {
61+
for (int j = 0; j < b.sc; j++) {
62+
gBoard[targetRow + i][b.c + j] = true;
63+
}
64+
}
65+
}
66+
}
67+
68+
private static int removeBlock() { // 꽉찬 행, 열 터치기
69+
int score = 0;
70+
71+
// 파란보드 (열 지우기)
72+
for (int c = 5; c >= 0; c--) {
73+
if (isColFull(c)) {
74+
removeCol(c);
75+
c++; // 열 제거후 이전 열이 지워진 열로 이동하기에, 같은열 다시 확인
76+
score++;
77+
}
78+
}
79+
80+
// 초록보드 (행 지우기)
81+
for (int r = 5; r >= 0; r--) {
82+
if (isRowFull(r)) {
83+
removeRow(r);
84+
r++;
85+
score++;
86+
}
87+
}
88+
89+
return score;
90+
}
91+
92+
private static boolean isColFull(int c) {
93+
for (int r = 0; r < 4; r++) {
94+
if (!bBoard[r][c]) return false;
95+
}
96+
return true;
97+
}
98+
99+
private static void removeCol(int c) {
100+
// 터질 열을 기준으로 왼쪽에서 한열씩 이동
101+
for (int j = c; j >0; j--) {
102+
for (int i = 0; i < 4; i++) {
103+
bBoard[i][j] = bBoard[i][j-1];
104+
}
105+
}
106+
107+
// 제일 끝 열(0열) 새 열로 초기화
108+
for (int r = 0; r < 4; r++) {
109+
bBoard[r][0] = false;
110+
}
111+
}
112+
113+
114+
private static boolean isRowFull(int r) {
115+
for (int c = 0; c < 4; c++) {
116+
if (!gBoard[r][c]) return false;
117+
}
118+
return true;
119+
}
120+
121+
private static void removeRow(int r) {
122+
// 터질 행 위에서 아래로 한 행씩 이동
123+
for (int i = r; i > 0; i--) {
124+
for (int j = 0; j < 4; j++) {
125+
gBoard[i][j] = gBoard[i - 1][j];
126+
}
127+
}
128+
129+
// 제일 처음 행(0행) 초기화
130+
for (int c = 0; c < 4; c++) {
131+
gBoard[0][c] = false;
132+
}
133+
}
134+
135+
private static void pushLight() {
136+
// 연한 파랑 처리
137+
int cnt1 = 0;
138+
for (int c = 0; c < 2; c++) {
139+
for (int r = 0; r < 4; r++) {
140+
if (bBoard[r][c]) {
141+
cnt1++;
142+
break;
143+
}
144+
}
145+
}
146+
147+
while (cnt1-- > 0) {
148+
removeCol(5);
149+
}
150+
151+
152+
// 연한 초록 처리
153+
int cnt2 = 0;
154+
for (int r = 0; r < 2; r++) {
155+
for (int c = 0; c < 4; c++) {
156+
if (gBoard[r][c]) {
157+
cnt2++;
158+
break;
159+
}
160+
}
161+
}
162+
163+
while (cnt2-- > 0) {
164+
removeRow(5);
165+
}
166+
}
167+
168+
private static int calBlock() {
169+
int cnt = 0;
170+
171+
// 파란 보드 값 세기
172+
for (int i = 0; i < 4; i++) {
173+
for (int j = 0; j < 6; j++) {
174+
if(bBoard[i][j]) cnt++;
175+
}
176+
}
177+
178+
// 초록 보드 값 세기
179+
for (int i = 0; i < 6; i++) {
180+
for (int j = 0; j < 4; j++) {
181+
if(gBoard[i][j]) cnt++;
182+
}
183+
}
184+
return cnt;
185+
}
186+
public static void main(String[] args) throws IOException {
187+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
188+
StringTokenizer st;
189+
StringBuilder sb = new StringBuilder();
190+
191+
int N = Integer.parseInt(br.readLine());
192+
while (N-- > 0) {
193+
st = new StringTokenizer(br.readLine());
194+
int t = Integer.parseInt(st.nextToken());
195+
int x = Integer.parseInt(st.nextToken());
196+
int y = Integer.parseInt(st.nextToken());
197+
198+
Block block = new Block(x, y, t);
199+
200+
// 블럭 놓기
201+
putBlueBlock(block);
202+
putGreenBlock(block);
203+
204+
// 타일 가득찬 블록 없애기
205+
ans += removeBlock();
206+
207+
// 연한 칸 블록 처리
208+
pushLight();
209+
}
210+
211+
// 점수 계산
212+
sb.append(ans).append('\n').append(calBlock());
213+
System.out.println(sb);
214+
}
215+
216+
static private void print(boolean[][] board) {
217+
StringBuilder sb = new StringBuilder();
218+
for (boolean[] b : board) {
219+
sb.append(Arrays.toString(b)).append('\n');
220+
}
221+
System.out.println(sb);
222+
}
223+
224+
static class Block{
225+
int r, c, sr, sc; // 좌표 위치, 블럭 사이즈
226+
227+
public Block(int r, int c, int type) {
228+
this.r = r;
229+
this.c = c;
230+
switch (type) {
231+
case 1:
232+
this.sr = 1;
233+
this.sc = 1;
234+
break;
235+
case 2:
236+
this.sr = 1;
237+
this.sc = 2;
238+
break;
239+
case 3:
240+
this.sr = 2;
241+
this.sc = 1;
242+
break;
243+
}
244+
}
245+
246+
@Override
247+
public String toString() {
248+
return "Block{" +
249+
"r=" + r +
250+
", c=" + c +
251+
", sr=" + sr +
252+
", sc=" + sc +
253+
'}';
254+
}
255+
}
256+
}

0 commit comments

Comments
(0)

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