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 140d184

Browse files
Merge pull request #76 from KodaHye/main
[6주차] 고다혜
2 parents 1ae18fa + 5a6e60c commit 140d184

13 files changed

+458
-0
lines changed

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 공유기 설치
6+
*/
7+
8+
public class BOJ2110 {
9+
public static void main(String[] args) throws Exception {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringTokenizer st = new StringTokenizer(br.readLine());
12+
13+
int N = Integer.parseInt(st.nextToken()); // 집의 개수
14+
int C = Integer.parseInt(st.nextToken()); // 공유기의 개수
15+
16+
int[] arr = new int[N]; // 집의 좌표 저장
17+
for(int i = 0; i < N; i++) arr[i] = Integer.parseInt(br.readLine());
18+
19+
Arrays.sort(arr);
20+
21+
// 공유기 C개 설치
22+
// 가장 인접한 두 공유기 사이의 거리를 가능한 크게 설치하려고 함
23+
// 두 공유기의 사이의 거리를 최대로 하는 프로그램 작성
24+
int s = 0, e = arr[N - 1] + 1;
25+
26+
int result = 0;
27+
// upperBound 구하기
28+
while(s < e) {
29+
int m = (s + e) / 2; // 공유기 사이 거리
30+
int cnt = getCnt(m, arr); // 설치해야되는 공유기 개수 구하기
31+
32+
// 설치한 공유기 개수가 필요한 것보다 많다면 거리 늘리기
33+
if(cnt >= C) {
34+
result = m;
35+
s = m + 1;
36+
} else {
37+
e = m;
38+
}
39+
}
40+
41+
System.out.println(result);
42+
}
43+
44+
// 설치해야 하는 공유기의 개수를 구하는 함수
45+
static int getCnt(int m, int[] arr) {
46+
int result = 1;
47+
int prev = arr[0];
48+
49+
for(int i = 1; i < arr.length; i++) {
50+
if(arr[i] - prev >= m) {
51+
result++;
52+
prev = arr[i];
53+
}
54+
}
55+
return result;
56+
}
57+
}

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

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 나무 자르기
6+
*/
7+
8+
public class BOJ2805 {
9+
public static void main(String[] args) throws Exception {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringTokenizer st = new StringTokenizer(br.readLine());
12+
13+
int N = Integer.parseInt(st.nextToken()); // 나무의 수
14+
int M = Integer.parseInt(st.nextToken()); // 적어도 M 미터의 나무를 집에 가져가기 위해 설정할 수 있는 높이의 최댓값
15+
16+
// 1 <= M <= 2_000_000_000이기 때문에 long 으로 설정
17+
long[] arr = new long[N];
18+
st = new StringTokenizer(br.readLine());
19+
20+
for(int i = 0; i < arr.length; i++) arr[i] = Long.parseLong(st.nextToken());
21+
22+
Arrays.sort(arr);
23+
24+
// 누적합 저장
25+
// 잘린 나무들의 합을 구해야 되는데, 반복문을 사용한다면
26+
// 시간 초과가 발생할 수 있을 것이라 판단하여 누적합 사용
27+
long[] sum = new long[N + 1];
28+
for(int i = 0; i < N; i++) {
29+
sum[i + 1] = sum[i]+ arr[i];
30+
}
31+
32+
// 절단기에 설정할 수 있는 높이의 최댓값
33+
// 많이 잘라야 됨 - upperIdx구하기
34+
long s = 0, e = arr[N - 1] + 1;
35+
long result = 0;
36+
37+
while(s < e) {
38+
long m = (s + e) / 2;
39+
// m이 있을 수 있는 가장 오른쪽 idx 반환
40+
int cutStartIdx = getUpperIdx(arr, m);
41+
// 잘린 나무들의 합 구하기
42+
long cutSum = (sum[N] - sum[cutStartIdx]) - (N - cutStartIdx) * m;
43+
44+
if(cutSum >= M) {
45+
// 만약 s = 1, e = 5 일 경우
46+
// 이후 s는 4가 되기 때문에 result 값을 저장해줘야 함
47+
result = m;
48+
s = m + 1;
49+
} else {
50+
e = m;
51+
}
52+
}
53+
54+
System.out.println(result);
55+
}
56+
57+
// target이 있을 수 있는 가장 오른쪽 idx 반환
58+
static int getUpperIdx(long[] arr, long target) {
59+
int s = 0, e = arr.length;
60+
61+
while(s < e) {
62+
int m = (s + e) / 2;
63+
64+
if(arr[m] <= target) s = m + 1;
65+
else e = m;
66+
}
67+
return s;
68+
}
69+
}

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 앱
6+
*/
7+
8+
public class DH_7579 {
9+
static class App {
10+
int m, c;
11+
12+
public App(int m, int c) {
13+
this.m = m;
14+
this.c = c;
15+
}
16+
}
17+
public static void main(String[] args) throws Exception {
18+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
19+
StringTokenizer st = new StringTokenizer(br.readLine());
20+
21+
int N = Integer.parseInt(st.nextToken()); // 앱의 개수
22+
int M = Integer.parseInt(st.nextToken()); // 추가 확보해야되는 메모리
23+
24+
App[] apps = new App[N + 1];
25+
for(int i = 0; i < apps.length; i++) apps[i] = new App(0, 0);
26+
st = new StringTokenizer(br.readLine());
27+
28+
for(int i = 1; i < apps.length; i++) {
29+
apps[i].m = Integer.parseInt(st.nextToken());
30+
}
31+
32+
st = new StringTokenizer(br.readLine());
33+
34+
int costSum = 0;
35+
for(int i = 1; i < apps.length; i++) {
36+
apps[i].c = Integer.parseInt(st.nextToken());
37+
costSum += apps[i].c;
38+
}
39+
40+
// 메모리 M바이트를 확보하기 위한 앱 비활성화 최소 비용을 찾기 위한 dp 배열
41+
// j원일 때 최대 몇 바이트까지 확보할 수 있는지 저장
42+
int[][] knapsack = new int[N + 1][costSum + 1];
43+
44+
for(int i = 1; i < knapsack.length; i++) {
45+
// 0 포함시켜줘야 함!
46+
for(int c = 0; c < knapsack[0].length; c++) {
47+
if(c - apps[i].c >= 0) {
48+
knapsack[i][c] = Math.max(knapsack[i - 1][c - apps[i].c] + apps[i].m, knapsack[i - 1][c]);
49+
} else {
50+
knapsack[i][c] = knapsack[i - 1][c];
51+
}
52+
}
53+
}
54+
55+
int result = 0;
56+
// 최대 확보할 수 있는 dp 배열의 정보까지 확인
57+
for(int c = 1; c < knapsack[0].length; c++) {
58+
if(knapsack[N][c] >= M) {
59+
result = c;
60+
break;
61+
}
62+
}
63+
64+
System.out.println(result);
65+
}
66+
}

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 동전
6+
*/
7+
8+
public class BOJ9084 {
9+
public static void main(String[] args) throws Exception {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringTokenizer st;
12+
13+
int T = Integer.parseInt(br.readLine());
14+
15+
StringBuilder sb = new StringBuilder();
16+
for(int tc = 0; tc < T; tc++) {
17+
int N = Integer.parseInt(br.readLine()); // 동전의 가지 수
18+
int[] coin = new int[N];
19+
20+
st = new StringTokenizer(br.readLine());
21+
for(int i = 0; i < coin.length; i++) coin[i] = Integer.parseInt(st.nextToken());
22+
23+
int M = Integer.parseInt(br.readLine());
24+
int[] dp = new int[M + 1]; // M원을 만들 수 있는 경우의 수 저장하는 배열
25+
26+
dp[0] = 1; // 0원을 만드는 경우는 모든 동전을 사용하지 않는 경우이므로 한 가지임
27+
for(int c: coin) {
28+
for(int i = 0; i < dp.length; i++) {
29+
if(i - c < 0) continue;
30+
dp[i] += dp[i - c];
31+
}
32+
}
33+
34+
sb.append(dp[M] + "\n");
35+
}
36+
37+
System.out.println(sb);
38+
}
39+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class DH_테트리스_블럭_안의_합_최대화_하기 {
5+
static int N, M, result, max;
6+
static int[][] map;
7+
// 중복을 최대한 줄여주기 위해 상, 좌, 우 방향만 사용
8+
static int[] dr = {0, 1, 0}, dc = {-1, 0, 1};
9+
static boolean[][] v;
10+
11+
static void solution() {
12+
// dfs 과정에서 원상복구 되기 때문에
13+
// 새로 생성하지 않아도 됨
14+
// dfs를 할 때마다 new boolean을 한다면 메모리 초과 발생
15+
v = new boolean[N][M];
16+
17+
for(int r = 0; r < N; r++) {
18+
for(int c = 0; c < M; c++) {
19+
// r, c 지점에서 dfs 시작
20+
v[r][c] = true;
21+
dfs(r, c, map[r][c], 0);
22+
v[r][c] = false;
23+
24+
}
25+
}
26+
27+
System.out.println(result);
28+
}
29+
30+
static void dfs(int r, int c, int sum, int depth) {
31+
// 현재까지의 합 + (전체 - 남은 depth 값) * map에서 최대값 <= result라면
32+
// 현재 r, c 지점에서 남은 depth값 보다 더 dfs를 하더라도 최대값이 될 수 없으므로
33+
// return
34+
if(sum + (3 - depth) * max <= result) return;
35+
// depth가 3이라면 return
36+
if(depth == 3) {
37+
result = Math.max(result, sum);
38+
return;
39+
}
40+
41+
for(int d = 0; d < 3; d++) {
42+
int nr = r + dr[d];
43+
int nc = c + dc[d];
44+
45+
if(!check(nr, nc) || v[nr][nc]) continue;
46+
47+
// T자형 블럭을 만들어주기 위한 부분
48+
// nr, nc 지점은 갔다고 방문 체크해주고
49+
// 다음 위치 값은 nr, nc가 아닌 r, c로 설정해주기
50+
if(depth == 1) {
51+
v[nr][nc] = true;
52+
dfs(r, c, sum + map[nr][nc], depth + 1);
53+
v[nr][nc] = false;
54+
}
55+
56+
// T자 외의 부분을 만들어 주기 위한 부분
57+
v[nr][nc] = true;
58+
dfs(nr, nc, sum + map[nr][nc], depth + 1);
59+
v[nr][nc] = false;
60+
}
61+
62+
}
63+
64+
static boolean check(int r, int c) {
65+
return r >= 0 && r < N && c >= 0 && c < M;
66+
}
67+
public static void main(String[] args) throws Exception {
68+
initInput();
69+
solution();
70+
}
71+
72+
static void initInput() throws Exception {
73+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
74+
StringTokenizer st = new StringTokenizer(br.readLine());
75+
76+
N = Integer.parseInt(st.nextToken());
77+
M = Integer.parseInt(st.nextToken());
78+
79+
map = new int[N][M];
80+
for(int r = 0; r < N; r++) {
81+
st = new StringTokenizer(br.readLine());
82+
for(int c = 0; c < M; c++) {
83+
map[r][c] = Integer.parseInt(st.nextToken());
84+
max = Math.max(map[r][c], max);
85+
}
86+
}
87+
}
88+
}

‎Programmers/Level3/DH_42861.java‎

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.util.*;
2+
3+
/*
4+
섬 연결하기
5+
*/
6+
7+
class DH_42861 {
8+
9+
static class Edge implements Comparable<Edge> {
10+
int s, e, w;
11+
public Edge(int s, int e, int w) {
12+
this.s = s;
13+
this.e = e;
14+
this.w = w;
15+
}
16+
17+
@Override
18+
public int compareTo(Edge o) {
19+
return Integer.compare(this.w, o.w);
20+
}
21+
}
22+
23+
static int[] p;
24+
static PriorityQueue<Edge> q;
25+
26+
static int mst() {
27+
int cnt = 0, result = 0;
28+
29+
// 간선이 N - 1개 만들어질 때까지 진행
30+
while(!q.isEmpty() && cnt < (p.length - 1) - 1) {
31+
Edge current = q.poll();
32+
33+
if(find(current.s) == find(current.e)) continue;
34+
union(current.s, current.e);
35+
result += current.w;
36+
}
37+
38+
return result;
39+
}
40+
41+
static void union(int a, int b) {
42+
a = find(a);
43+
b = find(b);
44+
45+
if(a != b) p[b] = a;
46+
}
47+
48+
static int find(int a) {
49+
return p[a] = a == p[a] ? a: find(p[a]);
50+
}
51+
52+
public int solution(int n, int[][] costs) {
53+
q = new PriorityQueue<>();
54+
p = new int[n + 1];
55+
for(int i = 0; i < p.length; i++) p[i] = i;
56+
57+
for(int[] c: costs) {
58+
int s = c[0];
59+
int e = c[1];
60+
int w = c[2];
61+
62+
// Queue에 Edge 저장
63+
q.add(new Edge(s, e, w));
64+
q.add(new Edge(e, s, w));
65+
}
66+
67+
return mst();
68+
}
69+
}

0 commit comments

Comments
(0)

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