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 73702ca

Browse files
Merge pull request #96 from yeahdy/main
[7주차] 이예진
2 parents 17dbf18 + 9270765 commit 73702ca

File tree

8 files changed

+460
-0
lines changed

8 files changed

+460
-0
lines changed

‎BOJ/1000-10000번/YJ_1535.java‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import java.io.*;
2+
3+
public class YJ_1535 {
4+
public static void main(String[] args) throws IOException {
5+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
6+
int N = Integer.parseInt(br.readLine());
7+
8+
String[] s = br.readLine().split("\\s");
9+
String[] h = br.readLine().split("\\s");
10+
int[] exhaustion = new int[N+1];
11+
int[] happy = new int[N+1];
12+
13+
for(int i=1; i<N+1; i++){
14+
exhaustion[i] = Integer.parseInt(s[i-1]);
15+
happy[i] = Integer.parseInt(h[i-1]);
16+
}
17+
18+
final int MAX_STAMINA = 100;
19+
int[] dp = new int[MAX_STAMINA+1]; //dp[체력]= 최대 기쁨
20+
for(int i = 1; i < N+1; i++){
21+
for(int stamina=MAX_STAMINA; stamina > 0; stamina--) { //뒤에서 부터 특정 체력에 대한 기쁨을 갱신하면서 반복
22+
int total = stamina-exhaustion[i]; //현재 체력에서 체력소모를 빼서 현재 상태에서 가능한 상황을 고려
23+
if (total > 0) {
24+
dp[stamina] = Math.max(dp[stamina], dp[total] + happy[i]); //"이미 갱신된 기쁨" vs "현재 체력소모를 포함하기 위해 이전 상태의 기쁨 + 현재 기쁨"을 비교하기
25+
//System.out.printf("dp[%d] = Math.max(dp[%d], dp[%d]+happy[%d])\n", stamina, stamina, total , i);
26+
//System.out.printf("%d = Math.max(%d, %d)\n\n", dp[stamina], dp[stamina], dp[total] + happy[i]);
27+
}
28+
}
29+
}
30+
31+
System.out.println(dp[MAX_STAMINA]); //최대체력인 dp[100]은 항상 최대기쁨 값이 보장된다
32+
}
33+
}

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import java.io.*;
2+
3+
public class YJ_2073 {
4+
public static void main(String[] args) throws IOException {
5+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
6+
String[] DP = br.readLine().split("\\s");
7+
int D = Integer.parseInt(DP[0]);
8+
int P = Integer.parseInt(DP[1]);
9+
10+
int[] length = new int[P];
11+
int[] capacity = new int[P];
12+
for(int i=0; i<P; i++){
13+
String[] data = br.readLine().split("\\s");
14+
length[i] = Integer.parseInt(data[0]);
15+
capacity[i] = Integer.parseInt(data[1]);
16+
}
17+
18+
int[] dp = new int[D+1]; //dp[특정거리] = 최대 용량
19+
dp[0] = Integer.MAX_VALUE; //초기 상태에서의 최소 용량을 설정하기 위해서 최대 정수를 설정
20+
21+
// 특정 거리에 만들 수 있는 수도관(여러 파이프들로 구성) 중 가장 큰 용량 구하기
22+
for(int i=0; i<P; i++){
23+
for(int distance=D; distance>=length[i]; distance--){
24+
//특정 거리에 만들 수 있는 수도관(여러 파이프들로 구성) 중 가장 큰 용량 구하기
25+
dp[distance] = Math.max(dp[distance], Math.min(capacity[i],dp[distance-length[i]]));
26+
}
27+
}
28+
29+
System.out.println(dp[D]);
30+
}
31+
}

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import java.util.Iterator;
2+
import java.util.Map;
3+
import java.util.Map.Entry;
4+
import java.util.Scanner;
5+
import java.util.TreeMap;
6+
import java.util.TreeSet;
7+
8+
public class YJ_21939 {
9+
static TreeMap<Integer, TreeSet<Integer>> workbook = new TreeMap<>(); //<난이도,문제번호>
10+
public static void main(String[] args) {
11+
Scanner scanner = new Scanner(System.in);
12+
int N = scanner.nextInt();
13+
for (int i = 0; i < N; i++) {
14+
int number = scanner.nextInt();
15+
int difficulty = scanner.nextInt();
16+
workbook.computeIfAbsent(difficulty, set -> new TreeSet<>())
17+
.add(number);
18+
}
19+
20+
while (scanner.hasNext()) {
21+
String say = scanner.next();
22+
switch (say) {
23+
case "recommend":
24+
recommend(scanner.nextInt());
25+
break;
26+
case "add":
27+
add(scanner.nextInt(), scanner.nextInt());
28+
break;
29+
case "solved":
30+
solved(scanner.nextInt());
31+
break;
32+
}
33+
}
34+
35+
scanner.close();
36+
}
37+
38+
static void recommend(int difficulty) {
39+
if (difficulty == 1) {
40+
System.out.println(workbook.lastEntry().getValue().last());
41+
} else {
42+
System.out.println(workbook.firstEntry().getValue().first());
43+
}
44+
}
45+
46+
static void add(int number, int difficulty) {
47+
workbook.computeIfAbsent(difficulty, set -> new TreeSet<>())
48+
.add(number);
49+
}
50+
51+
static void solved(int number) {
52+
Iterator<Entry<Integer, TreeSet<Integer>>> iterator = workbook.entrySet().iterator();
53+
while (iterator.hasNext()) {
54+
Map.Entry<Integer, TreeSet<Integer>> entry = iterator.next();
55+
if (entry.getValue().remove(number)) {
56+
if (entry.getValue().isEmpty()) {
57+
iterator.remove();
58+
}
59+
return;
60+
}
61+
}
62+
}
63+
}

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

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class YJ_5021 {
5+
static Map<String,ArrayList<String>> families = new HashMap<>(); //<자식,자식의부모 리스트>
6+
static Map<String,Double> bloodRatio = new HashMap<>(); //<계승후보,혈통비율>
7+
8+
public static void main(String[] args) throws IOException{
9+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
10+
String[] data = br.readLine().split("\\s");
11+
final int N = Integer.parseInt(data[0]);
12+
final int M = Integer.parseInt(data[1]);
13+
14+
final String king = br.readLine();
15+
for(int i=0; i<N; i++){
16+
String[] family = br.readLine().split("\\s");
17+
//위상정렬 그래프 초기화
18+
String child = family[0];
19+
families.computeIfAbsent(child, k -> new ArrayList<>());
20+
String dad = family[1];
21+
String mom = family[2];
22+
families.get(child).add(dad);
23+
families.get(child).add(mom);
24+
25+
//모든 사람들 혈통 1 초기화
26+
bloodRatio.put(child, 1.0);
27+
bloodRatio.put(dad, 1.0);
28+
bloodRatio.put(mom, 1.0);
29+
}
30+
//왕은 최상위 혈통으로 0
31+
bloodRatio.put(king, 0.0);
32+
33+
//후보자 별로 혈통 계산하기
34+
for(String name : bloodRatio.keySet()){
35+
findAnHeir(name);
36+
}
37+
38+
//계승자 찾기
39+
String nextKing = br.readLine();
40+
for(int i=1; i<M; i++){
41+
String candidate = br.readLine();
42+
if(bloodRatio.getOrDefault(nextKing,-1.0) < bloodRatio.getOrDefault(candidate,-1.0)){
43+
nextKing = candidate;
44+
}
45+
}
46+
System.out.println(nextKing);
47+
}
48+
49+
static double findAnHeir(String name){
50+
//왕이거나, 이미 혈통을 계산했을 경우
51+
if(!bloodRatio.get(name).equals(1.0)){
52+
return bloodRatio.get(name);
53+
}
54+
55+
ArrayList<String> parent = families.get(name);
56+
//왕족이 아닌 부모는 상위 부모가 없음
57+
if(Objects.isNull(parent)){
58+
bloodRatio.put(name,-1.0);
59+
return bloodRatio.get(name);
60+
}
61+
//깊이 탐색을 통해 자식의 부모로 올라가면서 현재 자식의 혈통을 계산
62+
double dad = findAnHeir(parent.get(0));
63+
double mom = findAnHeir(parent.get(1));
64+
65+
//모든 사람은 아버지의 혈통과 어머니의 혈통을 반 씩 받게 된다
66+
//dfs 탐색이 깊어질수록 혈통이 옅어짐 (1/2 > 1/4 > 1/16 ...)
67+
bloodRatio.put(name,(dad+mom)/2.0);
68+
69+
return bloodRatio.get(name);
70+
}
71+
}
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.LinkedList;
5+
import java.util.Queue;
6+
7+
public class YJ_시공의_돌풍 {
8+
static class Dust{
9+
int x;
10+
int y;
11+
int data;
12+
13+
Dust(int x, int y, int data){
14+
this.x = x;
15+
this.y = y;
16+
this.data = data;
17+
}
18+
}
19+
20+
static int[][] room;
21+
static int[][] temp;
22+
static boolean[][] visited;
23+
public static void main(String[] args) throws IOException {
24+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
25+
String[] data = br.readLine().split("\\s");
26+
int n = Integer.parseInt(data[0]);
27+
int m = Integer.parseInt(data[1]);
28+
int t = Integer.parseInt(data[2]);
29+
30+
visited = new boolean[n][m];
31+
room = new int[n][m];
32+
int[] tornado = new int[2];
33+
int z = 0;
34+
for(int i=0; i<n; i++){
35+
String[] d = br.readLine().split("\\s");
36+
for(int j=0; j<m; j++){
37+
int dust = Integer.parseInt(d[j]);
38+
if(dust == -1){
39+
visited [i][j] = true;
40+
tornado[z++] = i;
41+
}
42+
room[i][j] = dust;
43+
}
44+
}
45+
46+
int result = 0;
47+
while(t-- > 0){
48+
//먼지가 인접한 4방향의 상하좌우 칸으로 확산: bfs 너비탐색
49+
bfs(n,m);
50+
//시공의 돌풍이 청소를 시작
51+
goTornado(n,m,tornado);
52+
//확산된 먼지 합산
53+
result = calculateTotalDust(n,m);
54+
}
55+
System.out.println(result);
56+
}
57+
58+
static void bfs(int n, int m){
59+
final int SPREAD = 5;
60+
Queue<Dust> queue = new LinkedList<>();
61+
int[] nx = {1,0,-1,0};
62+
int[] ny = {0,1,0,-1};
63+
64+
temp = new int[n][m];
65+
queue.offer(new Dust(0,0,room[0][0]));
66+
67+
while(!queue.isEmpty()){
68+
Dust dust = queue.poll();
69+
int share = dust.data/SPREAD;
70+
71+
int currX = dust.x;
72+
int currY = dust.y;
73+
if(visited[currX][currY]){
74+
continue;
75+
}
76+
77+
for(int i=0; i<4; i++){
78+
int x = currX + nx[i];
79+
int y = currY + ny[i];
80+
81+
if(stop(x,y,n,m)){
82+
continue;
83+
}
84+
int next = room[x][y];
85+
if(next == -1){
86+
continue;
87+
}
88+
89+
temp[x][y] += share;
90+
room[currX][currY] -= share;
91+
queue.offer(new Dust(x,y,next));
92+
}
93+
visited[currX][currY] = true;
94+
}
95+
96+
sumDust(n,m);
97+
}
98+
99+
private static boolean stop(int x, int y, int n, int m){
100+
return x<0 || y<0 || x>=n || y>=m;
101+
}
102+
103+
private static void sumDust(int n, int m){
104+
for(int x=0; x<n; x++){
105+
for(int y=0; y<m; y++){
106+
room[x][y] += temp[x][y];
107+
}
108+
}
109+
}
110+
111+
static void goTornado(int n, int m, int[] tornado){
112+
up(0,0,tornado[0],m-1);
113+
down(tornado[1],0,n-1,m-1);
114+
cleaning(tornado);
115+
}
116+
// 0,0,윗태풍r,윗태풍c
117+
private static void up(int startR, int startC, int endR, int endC){
118+
int corner = room[startR][startC];
119+
//맨윗 줄 ←
120+
for(int c = startC; c<endC; c++){
121+
room[startR][c] = room[startR][c+1];
122+
}
123+
//맨오른쪽 줄 ↑
124+
for(int r = startR; r<endR; r++){
125+
room[r][endC] = room[r+1][endC];
126+
}
127+
//맨아랫 줄 →
128+
for(int c = endC; c>startC; c--){
129+
room[endR][c] = room[endR][c-1];
130+
}
131+
//맨왼쪽 줄 ↓
132+
for(int r = endR; r>startR; r--){
133+
room[r][startR] = room[r-1][startR];
134+
}
135+
room[startR+1][startC] = corner;
136+
}
137+
138+
// 아랫태풍r,0,끝r,끝c
139+
private static void down(int startR, int startC, int endR, int endC){
140+
int corner = room[startR][startC];
141+
//맨왼쪽 줄 ↓
142+
for(int r = startR; r<endR; r++){
143+
room[r][startC] = room[r+1][startC];
144+
}
145+
//맨아랫 줄 ←
146+
for(int c = startC; c<endC; c++){
147+
room[endR][c] = room[endR][c+1];
148+
}
149+
//맨오른쪽 줄 ↑
150+
for(int r = endR; r>startR; r--){
151+
room[r][endC] = room[r-1][endC];
152+
}
153+
//맨윗쪽 줄 →
154+
for(int c = endC; c>startC; c--){
155+
room[startR][c] = room[startR][c-1];
156+
}
157+
room[startR][startC+1] = corner;
158+
}
159+
160+
private static void cleaning(int[] tornado){
161+
room[tornado[0]][0] = -1;
162+
room[tornado[1]][0] = -1;
163+
room[tornado[0]][1] = 0;
164+
room[tornado[1]][1] = 0;
165+
}
166+
167+
static int calculateTotalDust(int n, int m){
168+
int result = 0;
169+
for(int x=0; x<n; x++){
170+
for(int y=0; y<m; y++){
171+
if(room[x][y] == -1){
172+
continue;
173+
}
174+
visited [x][y] = false;
175+
result += room[x][y];
176+
}
177+
}
178+
return result;
179+
}
180+
}

0 commit comments

Comments
(0)

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