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 5619f28

Browse files
Merge pull request #80 from yeahdy/main
[6주차] 이예진
2 parents 56b31ea + 2e8d3e6 commit 5619f28

10 files changed

+401
-0
lines changed

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import java.util.*;
2+
import java.io.*;
3+
4+
public class YJ_2110 {
5+
static int[] house;
6+
public static void main(String[] args) throws IOException{
7+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
String[] data = br.readLine().split("\\s");
9+
int N = Integer.parseInt(data[0]);
10+
int C = Integer.parseInt(data[1]);
11+
12+
house = new int[N];
13+
for(int i=0; i<N; i++){
14+
house[i] = Integer.parseInt(br.readLine());
15+
}
16+
Arrays.sort(house);
17+
System.out.println(binarySearch(C));
18+
}
19+
20+
static int binarySearch(int C){
21+
int left = 0;
22+
int right = house[house.length-1] - house[0]; //최대간격
23+
24+
while(left <= right){
25+
int mid = (left+right)/2; //★공유기를 설치할 최소거리 후보!
26+
27+
//공유기 설치하기
28+
int builtCount = 1;
29+
int current = house[0];
30+
for(int i=1; i<house.length; i++){
31+
if(house[i] - current >= mid){ //★거리 간격 >= mid 뜻은 house[i]가 mid 와 같은 위치에 있거나 mid 뒤에 있다는 뜻임
32+
builtCount++;
33+
current = house[i];
34+
}
35+
}
36+
37+
//간격 조정하면서 최적의 최대값 찾기
38+
if(builtCount >= C){
39+
left = mid + 1; //upperBound: mid 값을 높여서 간격을 넓힘
40+
}else {
41+
right = mid-1;
42+
}
43+
}
44+
return right;
45+
}
46+
}

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import java.io.*;
2+
import java.util.Arrays;
3+
4+
public class YJ_2805 {
5+
static int[] trees;
6+
public static void main(String[] args) throws IOException {
7+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
String[] data = br.readLine().split("\\s");
9+
int N = Integer.parseInt(data[0]);
10+
int M = Integer.parseInt(data[1]);
11+
12+
trees = new int[N];
13+
String[] t = br.readLine().split("\\s");
14+
for(int i=0; i<t.length; i++){
15+
trees[i] = Integer.parseInt(t[i]);
16+
}
17+
18+
Arrays.sort(trees);
19+
System.out.println(binarySearch(M));
20+
}
21+
22+
static int binarySearch(int M){
23+
int left = 0;
24+
int right = trees[trees.length-1];
25+
26+
while(left <= right){
27+
int mid = (left+right)/2;
28+
long sum = 0;
29+
30+
for(int tree : trees){
31+
int cutting = tree - mid;
32+
if(cutting > 0){
33+
sum += cutting;
34+
}
35+
}
36+
37+
if(sum >= M){
38+
left = mid+1;
39+
}else{
40+
right = mid-1;
41+
}
42+
}
43+
44+
return right;
45+
}
46+
}

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import java.io.*;
2+
3+
public class YJ_4781 {
4+
static int[] dp;
5+
public static void main(String[] args) throws IOException{
6+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
while(true){
8+
String line = br.readLine();
9+
if("0 0.00".equals(line)){
10+
break;
11+
}
12+
String[] data = line.split("\\s");
13+
int n = Integer.parseInt(data[0]);
14+
int money = stringToInt(data[1]);
15+
16+
dp = new int[money+1];
17+
for(int i=1; i<n+1; i++){
18+
String[] candy = br.readLine().split("\\s");
19+
int calorie = Integer.parseInt(candy[0]);
20+
int price = stringToInt(candy[1]);
21+
knapsack(calorie,price,money);
22+
}
23+
24+
System.out.println(dp[money]);
25+
}
26+
br.close();
27+
}
28+
29+
static void knapsack(int calorie,int price,int money){
30+
for (int m = price; m <= money; m++) {
31+
dp[m] = Math.max(dp[m], calorie + dp[m - price]);
32+
}
33+
}
34+
35+
private static int stringToInt(String data) {
36+
return Integer.parseInt(data.replace(".",""));
37+
}
38+
}

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import java.io.*;
2+
3+
public class YJ_7579 {
4+
static int[] memories;
5+
static int[] costs;
6+
public static void main(String[] args) throws IOException {
7+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
String[] data = br.readLine().split("\\s");
9+
int N = Integer.parseInt(data[0]);
10+
int M = Integer.parseInt(data[1]);
11+
12+
String[] nM = br.readLine().split("\\s");
13+
String[] nC = br.readLine().split("\\s");
14+
memories = new int[N];
15+
costs = new int[N];
16+
for(int i=0; i<N; i++){
17+
memories[i] = Integer.parseInt(nM[i]);
18+
costs[i] = Integer.parseInt(nC[i]);
19+
}
20+
21+
System.out.println(getMinCostSum(N,M));
22+
}
23+
24+
//내생각: dp배열의 값을 최소비용으로 두고 접근(X)
25+
//1차원 dp배열을 최대비용으로 값을 메모리로 두고 접근(O)
26+
static int getMinCostSum(int N, int M){
27+
//dp[비용] = 메모리
28+
int[] dp = new int[10001]; //최대 비용의 총합
29+
30+
for(int app=0; app<N; app++){
31+
for(int c=10000; c>=costs[app]; c--){
32+
//최소 비용으로 가질수있는 최대메모리(최대라면 항상 메모리를 충족함)
33+
dp[c] = Math.max(dp[c], dp[c-costs[app]]+memories[app]);
34+
//현재 메모리 vs (현재 메모리를 추가한다면) 이전 상태의 메모리★ + 현재메모리
35+
}
36+
}
37+
38+
int result = 0;
39+
for(int i=0; i<dp.length; i++){
40+
//최소 비용부터 탐색해서 적정메모리 이상이 있는지 조회
41+
if(dp[i] >= M){
42+
result = i;
43+
break;
44+
}
45+
}
46+
47+
return result;
48+
}
49+
}

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import java.io.*;
2+
3+
public class YJ_9084 {
4+
public static void main(String[] args) throws IOException{
5+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
6+
int T = Integer.parseInt(br.readLine());
7+
for(int t=0; t<T; t++){
8+
int N = Integer.parseInt(br.readLine());
9+
int[] coins = new int[N];
10+
String[] c = br.readLine().split("\\s");
11+
for(int i=0; i<N; i++){
12+
coins[i] = Integer.parseInt(c[i]);
13+
}
14+
int M = Integer.parseInt(br.readLine());
15+
16+
System.out.println(dp(coins,M));
17+
}
18+
}
19+
20+
static int dp(int[] coins, int M){
21+
int[] dp = new int[M+1];
22+
dp[0] = 1;
23+
24+
for(int coin : coins){
25+
for(int i=0; i<M+1; i++){
26+
if(coin>i){
27+
continue;
28+
}
29+
dp[i] += dp[i-coin];
30+
}
31+
}
32+
return dp[M];
33+
}
34+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.io.*;
2+
3+
public class YJ_테트리스_블럭_안의_합_최대화_하기 {
4+
static int n = 0;
5+
static int m = 0;
6+
7+
static int[][] block;
8+
static boolean[][] visited;
9+
static int maxSum = 0;
10+
public static void main(String[] args) throws IOException {
11+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
String[] line = br.readLine().split("\\s");
13+
n = Integer.parseInt(line[0]);
14+
m = Integer.parseInt(line[1]);
15+
16+
block = new int[n][m];
17+
for(int i=0; i<n; i++){
18+
String[] t = br.readLine().split("\\s");
19+
for(int j=0; j<m; j++){
20+
block[i][j] = Integer.parseInt(t[j]);
21+
}
22+
}
23+
24+
visited = new boolean[n][m];
25+
//블럭의 한칸마다 전체를 DFS 로 탐색 * 전체블럭 수
26+
for(int i=0; i<n; i++){
27+
for(int j=0; j<m; j++){
28+
visited[i][j] = true;
29+
dfs(1,i,j,block[i][j]);
30+
visited[i][j] = false;
31+
//ᅡᅩᅮᅥ 도형
32+
33+
}
34+
}
35+
36+
System.out.println(maxSum);
37+
}
38+
39+
//좌우상하
40+
static int[] dx = {0,0,-1,1};
41+
static int[] dy = {-1,1,0,0};
42+
static void dfs(int depth, int x, int y, int sum){
43+
if(depth == 4){
44+
maxSum = Math.max(maxSum, sum);
45+
return;
46+
}
47+
48+
//상하좌우 모두 탐색
49+
for(int i=0; i<4; i++){
50+
int nx = x + dx[i];
51+
int ny = y + dy[i];
52+
53+
if(stop(nx,ny)){
54+
continue;
55+
}
56+
visited[nx][ny] = true;
57+
if(depth == 2){
58+
dfs(depth+1, x,y,sum+block[nx][ny]);
59+
}
60+
dfs(depth+1, nx, ny, sum + block[nx][ny]);
61+
visited[nx][ny] = false;
62+
}
63+
64+
}
65+
66+
private static boolean stop(int nx, int ny){
67+
return nx < 0 || nx >= n || ny < 0 || ny >= m || visited[nx][ny];
68+
}
69+
}

‎Programmers/Level3/YJ_42861.java‎

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import java.util.Arrays;
2+
import java.util.Comparator;
3+
4+
public class YJ_42861 {
5+
static class Bridge {
6+
int x;
7+
int y;
8+
int cost;
9+
Bridge(int x, int y, int cost){
10+
this.x = x;
11+
this.y = y;
12+
this.cost = cost;
13+
}
14+
}
15+
16+
public static void main(String[] args) {
17+
int n = 4;
18+
int[][] costs = {{0,1,1},{0,2,2},{1,2,5},{1,3,1},{2,3,8}};
19+
System.out.println(solution(n,costs));
20+
}
21+
22+
static int solution(int n, int[][] costs) {
23+
int length = costs.length;
24+
Bridge[] bridgeArr = new Bridge[length];
25+
for(int i=0; i<length; i++){
26+
if(costs[i][2] == 0){
27+
continue;
28+
}
29+
bridgeArr[i] = new Bridge(costs[i][0],costs[i][1],costs[i][2]);
30+
}
31+
32+
Arrays.sort(bridgeArr, Comparator.comparingInt(o -> o.cost));
33+
34+
int[] parent = new int[length+1];
35+
for(int i=1; i<length+1; i++){
36+
parent[i] = i;
37+
}
38+
39+
int minCost = 0;
40+
int line = 0;
41+
for(Bridge bridge : bridgeArr){
42+
if(line == n-1){ //간선수는 n-1개
43+
break;
44+
}
45+
46+
if(find(parent, bridge.x) != find(parent, bridge.y)){
47+
union(parent,bridge.x,bridge.y);
48+
minCost += bridge.cost;
49+
line++;
50+
}
51+
}
52+
return minCost;
53+
}
54+
55+
static int find(int[] parent, int num){
56+
if(parent[num] == num){
57+
return parent[num];
58+
}
59+
return parent[num] = find(parent,parent[num]);
60+
}
61+
62+
static void union(int[] parent,int num1, int num2){
63+
if(num1 == num2){
64+
return;
65+
}
66+
if(num1 > num2){
67+
parent[num1] = num2;
68+
}else{
69+
parent[num2] = num1;
70+
}
71+
}
72+
}

‎Programmers/Level3/YJ_43238.java‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
public class YJ_43238 {
2+
public static void main(String[] args) {
3+
int n = 6;
4+
int[] times = {7, 10};
5+
System.out.println(binarySearch(n,times));
6+
}
7+
8+
static long binarySearch(int n, int[] times) {
9+
int length = times.length;
10+
long left = 0;
11+
long right = (long) times[length-1]*n;
12+
13+
while(left<right){
14+
long mid = (left+right)/2;
15+
16+
long count = 0;
17+
for(int time : times){
18+
count += mid/time;
19+
}
20+
21+
if(count>=n){
22+
right = mid;
23+
}else{
24+
left = mid+1;
25+
}
26+
}
27+
return right;
28+
}
29+
}

0 commit comments

Comments
(0)

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