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 6e4a001

Browse files
Merge pull request #208 from Jewan1120/main
[15주차] 백제완
2 parents 3f3ae5d + 20c82c1 commit 6e4a001

File tree

10 files changed

+506
-0
lines changed

10 files changed

+506
-0
lines changed

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.util.StringTokenizer;
4+
5+
public class JW_1030 {
6+
7+
static int s, n, k, r1, r2, c1, c2;
8+
static boolean[][] board;
9+
10+
public static void main(String[] args) throws Exception {
11+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
StringTokenizer st = new StringTokenizer(br.readLine());
13+
s = Integer.parseInt(st.nextToken());
14+
n = Integer.parseInt(st.nextToken());
15+
k = Integer.parseInt(st.nextToken());
16+
r1 = Integer.parseInt(st.nextToken());
17+
r2 = Integer.parseInt(st.nextToken());
18+
c1 = Integer.parseInt(st.nextToken());
19+
c2 = Integer.parseInt(st.nextToken());
20+
board = new boolean[r2 - r1 + 1][c2 - c1 + 1];
21+
makeBoard(s, 0, 0, false);
22+
StringBuilder sb = new StringBuilder();
23+
for (int i = 0; i < board.length; i++) {
24+
for (int j = 0; j < board[i].length; j++)
25+
if (board[i][j])
26+
sb.append("1");
27+
else
28+
sb.append("0");
29+
sb.append("\n");
30+
}
31+
System.out.println(sb);
32+
}
33+
34+
// 분할 정복으로 검은색 타일 채우기
35+
private static void makeBoard(int depth, int y, int x, boolean tile) {
36+
int len = (int) Math.pow(n, depth); // 그리드의 길이
37+
// 확인하지 않아도 되는 그리드라면 스킵
38+
if (isNotOverlap(y, x, len)) {
39+
return;
40+
}
41+
// 재귀 종료 조건
42+
if (depth == 0) {
43+
board[y - r1][x - c1] = tile; // true = 검은색 타일
44+
return;
45+
}
46+
int sLen = len / n; // 서브그리드의 길이
47+
int bsy = y + sLen * (n - k) / 2, bsx = x + sLen * (n - k) / 2; // 검은색 타일이 시작하는 좌표
48+
int bLen = sLen * k; // 검은색 타일의 길이
49+
// 서브 그리드별로 확인
50+
for (int i = y; i < y + len; i += sLen) {
51+
for (int j = x; j < x + len; j += sLen) {
52+
makeBoard(depth - 1, i, j, tile | isBlack(bsy, bsx, bLen, i, j)); // 다음 재귀 진행, 검은색 타일 체크
53+
}
54+
}
55+
}
56+
57+
// 유효한 그리드인지 체크
58+
private static boolean isNotOverlap(int y, int x, int len) {
59+
return y + len <= r1 || y > r2 || x + len <= c1 || x > c2;
60+
}
61+
62+
// 검은색 타일 체크
63+
private static boolean isBlack(int bsy, int bsx, int bLen, int y, int x) {
64+
return bsy <= y && y < bsy + bLen && bsx <= x && x < bsx + bLen;
65+
}
66+
}

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import java.util.ArrayDeque;
2+
import java.util.Deque;
3+
4+
public class JW_1725_1 {
5+
6+
public static void main(String[] args) throws Exception {
7+
int n = read();
8+
int[] arr = new int[n];
9+
for (int i = 0; i < n; i++)
10+
arr[i] = read();
11+
Deque<Integer> dq = new ArrayDeque<>(); // 가질 수 있는 최대 길이를 저장할 스택(덱)
12+
int[] left = new int[n]; // 각 인덱스 별로 가질 수 있는 왼쪽으로의 최대 길이
13+
for (int i = 0; i < n; i++) {
14+
left[i] = 1; // 초기값 = 자기 자신의 너비
15+
// 스택(덱)에 자신보다 큰 높이의 값이 있다면 해당 너비를 포함할 수 있음
16+
while (!dq.isEmpty() && arr[dq.peekLast()] >= arr[i])
17+
left[i] += left[dq.pollLast()]; // i 인덱스의 왼쪽 최대 길이에 합
18+
dq.offerLast(i); // 사용한 인덱스를 삽입
19+
}
20+
dq.clear(); // 스택(덱) 초기화
21+
// 왼쪽과 동일하게 진행
22+
int[] right = new int[n];
23+
for (int i = n - 1; i >= 0; i--) {
24+
right[i] = 1;
25+
while (!dq.isEmpty() && arr[dq.peekLast()] >= arr[i])
26+
right[i] += right[dq.pollLast()];
27+
dq.offerLast(i);
28+
}
29+
int max = 0;
30+
for (int i = 0; i < n; i++)
31+
max = Math.max(max, arr[i] * (left[i] + right[i] - 1)); // 넓이 계산
32+
System.out.println(max);
33+
}
34+
35+
private static int read() throws Exception {
36+
int c, n = System.in.read() & 15;
37+
while ((c = System.in.read()) >= 48)
38+
n = (n << 3) + (n << 1) + (c & 15);
39+
if (c == 13)
40+
System.in.read();
41+
return n;
42+
}
43+
}

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
public class JW_1725_2 {
2+
3+
static int[] arr;
4+
static int maxArea = 0;
5+
6+
public static void main(String[] args) throws Exception {
7+
int n = read();
8+
arr = new int[n];
9+
for (int i = 0; i < n; i++)
10+
arr[i] = read();
11+
recursive(0, n - 1);
12+
System.out.println(maxArea);
13+
}
14+
15+
// 분할 정복
16+
private static void recursive(int l, int r) {
17+
// 종료 조건
18+
if (l == r) {
19+
maxArea = Math.max(maxArea, arr[l]);
20+
return;
21+
}
22+
int m = (l + r) / 2;
23+
int h = arr[m];
24+
maxArea = Math.max(maxArea, arr[m]); // 너비가 1인 넓이 계산
25+
int toL = m, toR = m;
26+
// m을 기준으로 왼쪽, 오른쪽으로 1씩 늘려가면서 최대 넓이 계산 → 항상 최대높이의 왼쪽 or 오른쪽으로 최댓값
27+
while (l < toL && toR < r) {
28+
// 오른쪽으로 넓히는게 이득이라면
29+
if (arr[toL - 1] < arr[toR + 1]) {
30+
h = Math.min(h, arr[++toR]); // 최대 높이 갱신
31+
} else {
32+
h = Math.min(h, arr[--toL]); // 최대 높이 갱신
33+
}
34+
maxArea = Math.max(maxArea, h * (toR - toL + 1));
35+
}
36+
// 남은 인덱스까지 계산
37+
while (toR < r) {
38+
h = Math.min(h, arr[++toR]);
39+
maxArea = Math.max(maxArea, h * (toR - toL + 1));
40+
}
41+
while (l < toL) {
42+
h = Math.min(h, arr[--toL]);
43+
maxArea = Math.max(maxArea, h * (toR - toL + 1));
44+
}
45+
// 남은 부분에 대해서 재귀 호출
46+
recursive(l, m);
47+
recursive(m + 1, r);
48+
}
49+
50+
private static int read() throws Exception {
51+
int c, n = System.in.read() & 15;
52+
while ((c = System.in.read()) >= 48)
53+
n = (n << 3) + (n << 1) + (c & 15);
54+
if (c == 13)
55+
System.in.read();
56+
return n;
57+
}
58+
}

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
4+
public class JW_1992 {
5+
6+
static char[][] board;
7+
static StringBuilder sb = new StringBuilder();
8+
9+
public static void main(String[] args) throws Exception {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
int n = Integer.parseInt(br.readLine());
12+
board = new char[n][n];
13+
for (int i = 0; i < n; i++)
14+
board[i] = br.readLine().toCharArray();
15+
// 압축
16+
quardTree(n, 0, 0);
17+
System.out.println(sb);
18+
}
19+
20+
// 분할 정복, 재귀를 통한 압축
21+
private static void quardTree(int n, int y, int x) {
22+
// 압축이 가능하다면 압축
23+
if (isPossible(n, y, x)) {
24+
sb.append(board[y][x]);
25+
// 압축이 불가능하다면 분할 정복으로 압축 시도
26+
} else {
27+
sb.append("(");
28+
quardTree(n / 2, y, x);
29+
quardTree(n / 2, y, x + n / 2);
30+
quardTree(n / 2, y + n / 2, x);
31+
quardTree(n / 2, y + n / 2, x + n / 2);
32+
sb.append(")");
33+
}
34+
}
35+
36+
// 모두 같은 값을 가지는지 확인할 함수
37+
private static boolean isPossible(int n, int y, int x) {
38+
for (int i = 0; i < n; i++)
39+
for (int j = 0; j < n; j++)
40+
if (board[y][x] != board[y + i][x + j])
41+
return false;
42+
return true;
43+
}
44+
}

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

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import java.util.HashSet;
2+
3+
public class JW_4803 {
4+
5+
static int[] parent;
6+
7+
public static void main(String[] args) throws Exception {
8+
StringBuilder sb = new StringBuilder();
9+
int idx = 0;
10+
while (true) {
11+
int n = read(), m = read();
12+
if (n == 0 && m == 0)
13+
break;
14+
parent = new int[n + 1];
15+
for (int i = 0; i < n + 1; i++)
16+
parent[i] = i;
17+
boolean[] isCycle = new boolean[n + 1]; // 해당 노드가 사이클이 발생했는지 확인할 배열
18+
for (int i = 0; i < m; i++) {
19+
int x = read(), y = read();
20+
int rootX = find(x), rootY = find(y);
21+
// 부모가 같을 경우엔 사이클이 발생
22+
if (rootX == rootY)
23+
isCycle[rootX] = true;
24+
parent[rootX] = rootY;
25+
isCycle[rootY] |= isCycle[rootX]; // 사이클 전파
26+
}
27+
HashSet<Integer> roots = new HashSet<>();
28+
for (int i = 1; i < n + 1; i++) {
29+
int root = find(i);
30+
if (!isCycle[root])
31+
roots.add(root);
32+
}
33+
sb.append("Case ").append(++idx).append(": ");
34+
// 모두 사이클이 발생했을 경우
35+
if (roots.size() == 0)
36+
sb.append("No trees.\n");
37+
// 1개의 루트가 존재
38+
else if (roots.size() == 1)
39+
sb.append("There is one tree.\n");
40+
// n개의 루트가 존재
41+
else
42+
sb.append("A forest of ").append(roots.size()).append(" trees.\n");
43+
}
44+
System.out.println(sb);
45+
}
46+
47+
// Find 함수
48+
private static int find(int x) {
49+
if (x == parent[x])
50+
return parent[x];
51+
return parent[x] = find(parent[x]);
52+
}
53+
54+
private static int read() throws Exception {
55+
int c, n = System.in.read() & 15;
56+
while ((c = System.in.read()) >= 48)
57+
n = (n << 3) + (n << 1) + (c & 15);
58+
if (c == 13)
59+
System.in.read();
60+
return n;
61+
}
62+
}

‎BOJ/5001-10000번/JW_9372.java‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
public class JW_9372 {
2+
3+
public static void main(String[] args) throws Exception {
4+
int t = read();
5+
StringBuilder sb = new StringBuilder();
6+
while (t-- > 0) {
7+
int n = read(), m = read();
8+
for (int i = 0; i < m; i++) {
9+
read();
10+
read();
11+
}
12+
sb.append(n - 1).append("\n"); // n - 1만 출력
13+
}
14+
System.out.println(sb);
15+
}
16+
17+
private static int read() throws Exception {
18+
int c, n = System.in.read() & 15;
19+
while ((c = System.in.read()) >= 48)
20+
n = (n << 3) + (n << 1) + (c & 15);
21+
if (c == 13)
22+
System.in.read();
23+
return n;
24+
}
25+
}

0 commit comments

Comments
(0)

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