Skip to content

Commit aa0c8a3

Browse files
authored
Merge pull request gumi-6-ASIX#41 from gumi-6-ASIX/nakyung128
add: 14주차 문제 풀이
2 parents b4787e3 + 10bd279 commit aa0c8a3

File tree

3 files changed

+198
-0
lines changed

3 files changed

+198
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.StringTokenizer;
5+
6+
public class BOJ14719_빗물 {
7+
public static void main(String[] args) throws IOException {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
StringTokenizer st = new StringTokenizer(br.readLine());
10+
11+
Integer.parseInt(st.nextToken());
12+
int w = Integer.parseInt(st.nextToken());
13+
int[] blocks = new int[w];
14+
15+
int high = 0;
16+
st = new StringTokenizer(br.readLine());
17+
for (int i = 0; i < w; i++) {
18+
blocks[i] = Integer.parseInt(st.nextToken());
19+
high = Math.max(high, blocks[i]);
20+
}
21+
22+
int rain = 0;
23+
24+
/**
25+
* 제일 높은 블록까지 높이 한 칸씩 본다고 생각하면 됨.
26+
* 높이 1 ~ high까지 반복
27+
* 현재 높이보다 작은 블록인데 양쪽에 현재 높이보다 크거나 같은 블록이 있으면
28+
* 그 블록 위에 쌓일 수 있음 (cnt + 1)
29+
*/
30+
31+
for (int i = 1; i <= high; i++) {
32+
int cnt = 0;
33+
for (int j = 1; j < w - 1; j++) {
34+
// 현재 높이보다 작은 블록이면 (양끝 제외)
35+
if (blocks[j] < i) {
36+
boolean leftAble = false;
37+
boolean rightAble = false;
38+
39+
// 왼쪽 현재 높이보다 같거나 높은 거 있으면 쌓임
40+
for (int left = j - 1; left >= 0; left--) {
41+
if (blocks[left] >= i) {
42+
leftAble = true;
43+
break;
44+
}
45+
}
46+
// 오른쪽도
47+
for (int right = j + 1; right < w; right++) {
48+
if (blocks[right] >= i) {
49+
rightAble = true;
50+
break;
51+
}
52+
}
53+
54+
if (leftAble && rightAble) {
55+
cnt++;
56+
}
57+
}
58+
}
59+
rain += cnt;
60+
}
61+
System.out.println(rain);
62+
}
63+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.ArrayList;
5+
import java.util.LinkedList;
6+
import java.util.Queue;
7+
import java.util.StringTokenizer;
8+
9+
/**
10+
* 위상정렬
11+
*/
12+
13+
public class BOJ2623_음악프로그램 {
14+
static int n, m;
15+
static ArrayList<ArrayList<Integer>> graph;
16+
static int[] link;
17+
static Queue<Integer> q;
18+
19+
public static void main(String[] args) throws IOException {
20+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
21+
StringTokenizer st = new StringTokenizer(br.readLine());
22+
23+
n = Integer.parseInt(st.nextToken());
24+
m = Integer.parseInt(st.nextToken());
25+
26+
graph = new ArrayList<>();
27+
for (int i = 0; i < n + 1; i++) {
28+
graph.add(new ArrayList<>());
29+
}
30+
31+
link = new int[n + 1];
32+
for (int i = 0; i < m; i++) {
33+
st = new StringTokenizer(br.readLine());
34+
int num = Integer.parseInt(st.nextToken());
35+
int[] arr = new int[num];
36+
37+
for (int idx = 0; idx < arr.length; idx++) {
38+
arr[idx] = Integer.parseInt(st.nextToken());
39+
}
40+
41+
for (int j = 0; j < arr.length - 1; j++) {
42+
int first = arr[j];
43+
int second = arr[j + 1];
44+
45+
graph.get(first).add(second);
46+
link[second]++;
47+
}
48+
}
49+
50+
q = new LinkedList<>();
51+
for (int i = 1; i < link.length; i++) {
52+
if (link[i] == 0) {
53+
q.offer(i);
54+
}
55+
}
56+
57+
sort();
58+
}
59+
60+
static void sort() {
61+
StringBuilder sb = new StringBuilder();
62+
while (!q.isEmpty()) {
63+
int now = q.poll();
64+
sb.append(now + "\n");
65+
66+
for (int node : graph.get(now)) {
67+
if (--link[node] == 0) {
68+
q.offer(node);
69+
}
70+
}
71+
}
72+
73+
// 진입 차수 남아 있는 것이 있으면 순서 못 정하는 것이므로 0 출력
74+
for (int l : link) {
75+
if (l != 0) {
76+
System.out.println(0);
77+
System.exit(0);
78+
}
79+
}
80+
81+
System.out.println(sb);
82+
}
83+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
5+
public class BOJ5904_Moo게임 {
6+
7+
public static void main(String[] args) throws IOException {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
10+
int n = Integer.parseInt(br.readLine());
11+
12+
findChar(0, n, 0);
13+
}
14+
15+
static void findChar(int preLen, int n, int k) {
16+
// 현재 moo 수열의 길이
17+
int len = 2 * preLen + k + 3;
18+
19+
// n이 3 이하면
20+
if (n <= 3) {
21+
if (n == 1) {
22+
System.out.println("m");
23+
System.exit(0);
24+
} else {
25+
System.out.println("o");
26+
System.exit(0);
27+
}
28+
}
29+
30+
// 현재 수열 길이가 n보다 크면
31+
if (len >= n) {
32+
// 만약 S(k-1) + k + 3보다 크면 뒷부분 (S(k-1)과 똑같은 부분)
33+
if (n > preLen + k + 3) {
34+
n -= preLen + k + 3;
35+
findChar(0, n, 0);
36+
} else if (n > preLen && n < preLen + k + 4) { // 만약 이 범위 내면 새로 추가된 문자열 내부 (m + o..o)
37+
// 이전 문자열의 길이 빼주고
38+
n -= preLen;
39+
40+
if (n == 1) {
41+
System.out.println("m");
42+
System.exit(0);
43+
} else {
44+
System.out.println("o");
45+
System.exit(0);
46+
}
47+
}
48+
} else { // 수열보다 n이 크면 수열 증가시키기
49+
findChar(len, n, k + 1);
50+
}
51+
}
52+
}

0 commit comments

Comments
 (0)