Skip to content

Commit 167bbad

Browse files
authored
Merge pull request #18 from GreatAlgorithm-Study/xubin
[2주차] 배수빈
2 parents 6736852 + 6582af7 commit 167bbad

12 files changed

+636
-0
lines changed

BOJ/1000-10000번/SB_1647.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
* 도시 분할 계획
3+
* */
4+
5+
import java.io.BufferedReader;
6+
import java.io.IOException;
7+
import java.io.InputStreamReader;
8+
import java.util.*;
9+
10+
public class SB_1647 {
11+
static int N, M;
12+
static List<Node> adj = new ArrayList<>();
13+
static int[] parent;
14+
15+
private static int find(int x) {
16+
if (x != parent[x])
17+
parent[x] = find(parent[x]);
18+
return parent[x];
19+
}
20+
21+
private static void union(int x, int y) {
22+
if (x>y) parent[y] = x;
23+
else parent[x] = y;
24+
}
25+
public static void main(String[] args) throws IOException {
26+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
27+
StringTokenizer st = new StringTokenizer(br.readLine());
28+
29+
N = Integer.parseInt(st.nextToken());
30+
M = Integer.parseInt(st.nextToken());
31+
32+
for (int i = 0; i < M; i++) {
33+
st = new StringTokenizer(br.readLine());
34+
int a = Integer.parseInt(st.nextToken());
35+
int b = Integer.parseInt(st.nextToken());
36+
int c = Integer.parseInt(st.nextToken());
37+
adj.add(new Node(a, b, c));
38+
}
39+
40+
parent = new int[N + 1];
41+
for (int i = 0; i < N + 1; i++) {
42+
parent[i] = i;
43+
}
44+
45+
adj.sort(Comparator.naturalOrder());
46+
47+
List<Integer> ans = new ArrayList<>();
48+
for (Node node : adj) {
49+
int p_u = find(node.u);
50+
int p_v = find(node.v);
51+
if (p_u != p_v) {
52+
union(p_u, p_v);
53+
ans.add(node.cost);
54+
}
55+
}
56+
57+
int mx = Integer.MIN_VALUE;
58+
int sum = 0;
59+
for (int x : ans) {
60+
if (x > mx) mx = x;
61+
sum+=x;
62+
}
63+
System.out.println(sum-mx);
64+
}
65+
66+
static class Node implements Comparable<Node>{
67+
int u;
68+
int v;
69+
int cost;
70+
71+
Node(int u, int v, int cost) {
72+
this.u = u;
73+
this.v = v;
74+
this.cost = cost;
75+
}
76+
77+
@Override
78+
public int compareTo(Node o) {
79+
return Integer.compare(this.cost, o.cost);
80+
}
81+
}
82+
}

BOJ/1000-10000번/SB_2531.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.*;
5+
6+
/*
7+
* 회전 초밥
8+
* 문제: 최대로 초밥먹을 수 있는 갯수 구하기
9+
* */
10+
public class SB_2531 {
11+
static int N, D, K, C;
12+
static int[] foods;
13+
public static void main(String[] args) throws IOException {
14+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
15+
StringTokenizer st = new StringTokenizer(br.readLine());
16+
17+
N = Integer.parseInt(st.nextToken());
18+
D = Integer.parseInt(st.nextToken());
19+
K = Integer.parseInt(st.nextToken());
20+
C = Integer.parseInt(st.nextToken());
21+
22+
foods = new int[N];
23+
for (int i = 0; i < N; i++) {
24+
foods[i] = Integer.parseInt(br.readLine());
25+
}
26+
27+
int left = 0;
28+
int right = 0;
29+
int mx = 0;
30+
31+
HashMap<Integer, Integer> eat = new HashMap<>();
32+
eat.put(foods[left], 1);
33+
while (left < N) {
34+
while (right - left < K-1) {
35+
right++;
36+
if (foods[right%N]==C) continue;
37+
eat.put(foods[right%N], eat.getOrDefault(foods[right%N], 0) + 1);
38+
}
39+
mx = Math.max(mx, eat.size());
40+
41+
eat.put(foods[left], eat.getOrDefault(foods[left], 0) - 1);
42+
if (eat.get(foods[left]) <= 0) {
43+
eat.remove(foods[left]);
44+
}
45+
left++;
46+
}
47+
System.out.println(mx+1);
48+
}
49+
}
50+
51+
/*
52+
* 회전초밥 일자가 아니라 원형으로 되어있음
53+
* */

BOJ/1000-10000번/SB_2631.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
7+
/*
8+
* 줄세우기
9+
* 문제: 최소한의 자리이동으로 정렬
10+
* 설계: N - 최장부분증가수열
11+
* */
12+
public class SB_2631 {
13+
static int N;
14+
static int[] line;
15+
static List<Integer> lst = new ArrayList<>();
16+
17+
private static int findIdx(int x) {
18+
int left = 0;
19+
int right = lst.size()-1;
20+
21+
while (left < right) {
22+
int mid = (left + right) / 2;
23+
if (lst.get(mid) < x) left = mid+1;
24+
else right = mid;
25+
}
26+
return left;
27+
}
28+
public static void main(String[] args) throws IOException {
29+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
30+
N = Integer.parseInt(br.readLine());
31+
line = new int[N];
32+
33+
for (int i = 0; i < N; i++) {
34+
line[i] = Integer.parseInt(br.readLine());
35+
}
36+
37+
// 이분탐색으로 최장부분증가수열 구하기
38+
lst.add(line[0]);
39+
for (int i=1; i<N; i++) {
40+
if (line[i] > lst.get(lst.size() - 1)) lst.add(line[i]);
41+
else {
42+
int idx = findIdx(line[i]);
43+
lst.set(idx, line[i]);
44+
}
45+
}
46+
System.out.println(N-lst.size());
47+
}
48+
}

BOJ/1000-10000번/SB_3020.java

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.Arrays;
5+
import java.util.StringTokenizer;
6+
7+
/*
8+
* 개똥벌레
9+
* 문제 설명: 석순, 종유석이 주어질때, 몇번째 라인으로 가야 개똥이가 최소 장애물 파괴하는지. 최소 장애물 파괴 수 + 해당 하는 구간의 갯수
10+
* 설계
11+
* - 해당하는 구간의 갯수를 모두 구해야하기에 높이 H만큼 다 탐색해야함
12+
* - N*H불가, logN 또는 N 시간복잡도로 해결하기 >> 투포인터? (: 반복 여러번일때 사용)
13+
* - 종유석은(홀수) H-값 형태로 높이h에 위치하는지 확인
14+
* - 순서 상관없이 특정 위치에서 부딪히는 갯수 일정 >> 정렬 가능
15+
* 구현
16+
* - M번째에 위치할때 몇개 부딪히는지 구하기
17+
* 이분탐색으로 현재 리스트에서 i가 들어가야할 위치 찾기 (중복된 수 존재하니까 low-bound)
18+
* 전체 리스트 길이(M)-i == 부딪히는 갯수, (이때 리스트는 석순, 종유석 따로 관리)
19+
* - 석순, 종유석 리스트 따로 구하기
20+
* 석순i에서 종유석의 위치는 H-i+1번째
21+
* 시간복잡도 이분탐색O(NlonN)*2N
22+
* */
23+
public class SB_3020 {
24+
static int N, H, M;
25+
static int[] down;
26+
static int[] up;
27+
28+
private static int findIdx(int target, int[] lst) {
29+
int left = 0;
30+
int right = M;
31+
while (left < right) {
32+
int mid = (left + right) / 2;
33+
if (lst[mid] < target){ // low-bound, target이 존재할 제일 왼쪽반환 >> target 직전 작은값+1 위치
34+
left = mid+1;
35+
}
36+
else {
37+
right = mid;
38+
}
39+
}
40+
return right;
41+
}
42+
public static void main(String[] args) throws IOException {
43+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
44+
StringTokenizer st = new StringTokenizer(br.readLine());
45+
N = Integer.parseInt(st.nextToken());
46+
H = Integer.parseInt(st.nextToken());
47+
48+
M = N/2;
49+
// 석순, 종유석 리스트에 값 담기
50+
down = new int[M];
51+
up = new int[M];
52+
for (int i = 0; i < N; i++) {
53+
if (i%2==0) down[i / 2] = Integer.parseInt(br.readLine());
54+
else up[(i - 1) / 2] = Integer.parseInt(br.readLine());
55+
}
56+
57+
Arrays.sort(down);
58+
Arrays.sort(up);
59+
60+
int mn = Integer.MAX_VALUE;
61+
int cnt = 0;
62+
63+
// 각 층에서 부딪히는 갯수 구하기
64+
for (int i = 1; i < H + 1; i++) {
65+
int hitDown = M - findIdx(i, down);
66+
int hitUp = M - findIdx(H - i + 1, up);
67+
68+
int totalHit = hitDown+hitUp;
69+
if (totalHit < mn){
70+
mn = totalHit;
71+
cnt = 1;
72+
} else if (totalHit==mn) cnt++;
73+
}
74+
75+
System.out.println(mn + " " + cnt);
76+
}
77+
}
78+
79+
/*
80+
* 궁금증, 무한루프 방지를 위해 int mid = (left + (right-left)) / 2; 와 같이 적는걸로 아는데 이렇게 하면 무한루프 빠짐
81+
* */

0 commit comments

Comments
 (0)