Skip to content

Commit a088a48

Browse files
committed
feat: 36주차 완료
1 parent c7a2eaa commit a088a48

File tree

4 files changed

+392
-0
lines changed

4 files changed

+392
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package week36.강성욱.baekjoon;
2+
3+
import java.io.BufferedReader;
4+
import java.io.InputStreamReader;
5+
import java.util.StringTokenizer;
6+
7+
/**
8+
* PackageName : week36.강성욱.baekjoon
9+
* FileName : 도영이가_만든_맛있는_음식
10+
* Author : Baekgwa
11+
* Date : 26. 1. 7.
12+
* Description :
13+
* =====================================================================================================================
14+
* DATE AUTHOR NOTE
15+
* ---------------------------------------------------------------------------------------------------------------------
16+
* 26. 1. 7. Baekgwa Initial creation
17+
*/
18+
public class 도영이가_만든_맛있는_음식 {
19+
public class Main {
20+
// 먼저 생각나는건, 재료의 개수를 모든 조합에 넣어보기
21+
// 줄일 수 있나?
22+
// 정렬해두면? 너무 까다롭다.
23+
// 10개니깐 할만 할꺼 같기두?
24+
// 2^10 = 1024 조합 인데, 1개 공집합 빼면 1023개네
25+
26+
private static long minDiff = Long.MAX_VALUE;
27+
private static int N;
28+
private static Material[] materials;
29+
30+
public static void main(String[] args) throws Exception {
31+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
32+
33+
N = Integer.parseInt(br.readLine()); // 재료의 개수
34+
materials = new Material[N];
35+
StringTokenizer st;
36+
for(int i=0; i<N; i++) {
37+
st = new StringTokenizer(br.readLine());
38+
long sour = Long.parseLong(st.nextToken());
39+
long bitter = Long.parseLong(st.nextToken());
40+
materials[i] = new Material(sour, bitter);
41+
}
42+
43+
// 재귀 함수를 통한 min 값 확인
44+
back(0, 1, 0, 0);
45+
46+
System.out.println(minDiff);
47+
}
48+
49+
public static void back(int idx, long beforeSour, long beforeBitter, int count) {
50+
if (idx == N) {
51+
if (count == 0) return; // 다 안뽑는 경우 패스
52+
minDiff = Math.min(minDiff, Math.abs(beforeSour - beforeBitter));
53+
return;
54+
}
55+
56+
long nowSour = beforeSour * materials[idx].getSour();
57+
long nowBitter = beforeBitter + materials[idx].getBitter();
58+
59+
back(idx + 1, nowSour, nowBitter, count + 1);
60+
back(idx + 1, beforeSour, beforeBitter, count);
61+
}
62+
63+
public static class Material {
64+
private final long sour; // 신맛
65+
private final long bitter; // 쓴맛
66+
67+
public Material(long sour, long bitter) {
68+
this.sour = sour;
69+
this.bitter = bitter;
70+
}
71+
72+
public long getSour() {
73+
return sour;
74+
}
75+
76+
public long getBitter() {
77+
return bitter;
78+
}
79+
}
80+
}
81+
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package week36.강성욱.baekjoon;
2+
3+
import java.io.BufferedReader;
4+
import java.io.InputStreamReader;
5+
import java.util.ArrayList;
6+
import java.util.Arrays;
7+
import java.util.Comparator;
8+
import java.util.List;
9+
import java.util.PriorityQueue;
10+
import java.util.StringTokenizer;
11+
12+
/**
13+
* PackageName : week36.강성욱.baekjoon
14+
* FileName : 비밀_모임
15+
* Author : Baekgwa
16+
* Date : 26. 1. 7.
17+
* Description :
18+
* =====================================================================================================================
19+
* DATE AUTHOR NOTE
20+
* ---------------------------------------------------------------------------------------------------------------------
21+
* 26. 1. 7. Baekgwa Initial creation
22+
*/
23+
public class 비밀_모임 {
24+
public class Main {
25+
26+
public static void main(String[] args) throws Exception {
27+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
28+
int T = Integer.parseInt(br.readLine());
29+
30+
StringBuilder sb = new StringBuilder();
31+
32+
while (T-- > 0) {
33+
StringTokenizer st = new StringTokenizer(br.readLine());
34+
int N = Integer.parseInt(st.nextToken()); // 방의 개수
35+
int M = Integer.parseInt(st.nextToken()); // 비밀통로의 개수
36+
37+
List<List<Edge>> graph = new ArrayList<>();
38+
for(int i=0; i<=N; i++) {
39+
graph.add(new ArrayList<>());
40+
}
41+
42+
for(int i=0; i<M; i++) {
43+
st = new StringTokenizer(br.readLine());
44+
int a = Integer.parseInt(st.nextToken());
45+
int b = Integer.parseInt(st.nextToken());
46+
int cost = Integer.parseInt(st.nextToken());
47+
48+
graph.get(a).add(new Edge(b, cost));
49+
graph.get(b).add(new Edge(a, cost));
50+
}
51+
52+
// 시작지점 목록 조회
53+
int K = Integer.parseInt(br.readLine()); // 친구 수
54+
int[][] dist = new int[K][N+1];
55+
st = new StringTokenizer(br.readLine());
56+
for(int i=0; i<K; i++) {
57+
int startNode = Integer.parseInt(st.nextToken());
58+
dist[i] = dijkstra(startNode, N, new ArrayList<>(graph));
59+
}
60+
61+
// 친구들 모두가 가장 가까운 최적의 정점 확인
62+
int minDist = Integer.MAX_VALUE;
63+
int minNode = -1;
64+
65+
for(int i=1; i<=N; i++) {
66+
int sum = 0;
67+
for (int[] distance : dist) {
68+
sum += distance[i];
69+
}
70+
71+
if(minDist > sum) {
72+
minDist = sum;
73+
minNode = i;
74+
}
75+
}
76+
77+
sb.append(minNode).append("\n");
78+
}
79+
80+
System.out.println(sb.toString());
81+
}
82+
83+
public static int[] dijkstra(int startNode, int N, List<List<Edge>> graph) {
84+
int[] dist = new int[N+1];
85+
Arrays.fill(dist, Integer.MAX_VALUE);
86+
dist[startNode] = 0;
87+
88+
PriorityQueue<Edge> pq = new PriorityQueue<>(Comparator.comparing(Edge::getCost));
89+
pq.offer(new Edge(startNode, 0));
90+
91+
while(!pq.isEmpty()) {
92+
Edge e = pq.poll();
93+
int nowCost = e.getCost(); // 현재 위치에 도달하기 위한 비용
94+
int nowNode = e.getNode(); // 현재 위치
95+
96+
if(nowCost > dist[nowNode]) continue; // 지금이 최소 비용이 아니면 패스, 더 볼필요 x
97+
98+
// 현재 위치에서 갈 수 있는 모든 곳 넣기
99+
for (Edge edge : graph.get(nowNode)) {
100+
int next = edge.getNode();
101+
int nextCost = edge.getCost() + nowCost;
102+
103+
if(dist[next] <= nextCost) continue;
104+
105+
dist[next] = nextCost;
106+
pq.offer(new Edge(next, nextCost));
107+
}
108+
}
109+
110+
return dist;
111+
}
112+
113+
public static class Edge {
114+
private int node;
115+
private int cost;
116+
117+
public Edge(int node, int cost) {
118+
this.node = node;
119+
this.cost = cost;
120+
}
121+
122+
public int getNode() {
123+
return node;
124+
}
125+
126+
public int getCost() {
127+
return cost;
128+
}
129+
}
130+
}
131+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package week36.강성욱.baekjoon;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.util.Arrays;
7+
import java.util.StringTokenizer;
8+
9+
/**
10+
* PackageName : week36.강성욱.baekjoon
11+
* FileName : 여행_가자
12+
* Author : Baekgwa
13+
* Date : 26. 1. 7.
14+
* Description :
15+
* =====================================================================================================================
16+
* DATE AUTHOR NOTE
17+
* ---------------------------------------------------------------------------------------------------------------------
18+
* 26. 1. 7. Baekgwa Initial creation
19+
*/
20+
public class 여행_가자 {
21+
public class Main {
22+
23+
// 1. 유니온 파인드 적용
24+
public static void main(String[] args) throws IOException {
25+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
26+
int N = Integer.parseInt(br.readLine()); // 도시 수
27+
int M = Integer.parseInt(br.readLine()); // 여행할 도시 수
28+
29+
int[] parent = new int[N+1];
30+
Arrays.fill(parent, -1);
31+
32+
// 도시 연결
33+
for (int i = 1; i <= N; i++) {
34+
StringTokenizer st = new StringTokenizer(br.readLine());
35+
for (int j = 1; j <= N; j++) {
36+
int isConnect = Integer.parseInt(st.nextToken());
37+
if (isConnect == 1) {
38+
union(parent, i, j);
39+
}
40+
}
41+
}
42+
43+
StringTokenizer st= new StringTokenizer(br.readLine());
44+
int first = Integer.parseInt(st.nextToken());
45+
for(int i=1; i<M; i++) {
46+
int next = Integer.parseInt(st.nextToken());
47+
if(!isSameUnion(parent, first, next)) {
48+
System.out.println("NO");
49+
return;
50+
}
51+
}
52+
53+
System.out.println("YES");
54+
}
55+
56+
// a와 b의 최상위 루트 노드를 결합.
57+
// a 의 루트 노드 위에 b를 추가
58+
// 즉 b -> a 로 결합
59+
private static void union(int[] parent, int a, int b) {
60+
61+
int rootNodeA = find(parent, a);
62+
int rootNodeB = find(parent, b);
63+
64+
if(rootNodeA == rootNodeB) return;
65+
66+
parent[rootNodeA] = rootNodeB;
67+
}
68+
69+
// x의 최상위 루트 노드를 찾는 메서드
70+
private static int find(int[] parent, int x) {
71+
72+
if(parent[x] == -1) {
73+
return x;
74+
}
75+
76+
return find(parent, parent[x]);
77+
}
78+
79+
private static boolean isSameUnion(int[] parent, int a, int b) {
80+
return find(parent, a) == find(parent, b);
81+
}
82+
}
83+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package week36.강성욱.baekjoon;
2+
3+
import java.io.BufferedReader;
4+
import java.io.InputStreamReader;
5+
import java.util.ArrayList;
6+
import java.util.Arrays;
7+
import java.util.List;
8+
import java.util.StringTokenizer;
9+
10+
/**
11+
* PackageName : week36.강성욱.baekjoon
12+
* FileName : 출석체크
13+
* Author : Baekgwa
14+
* Date : 26. 1. 7.
15+
* Description :
16+
* =====================================================================================================================
17+
* DATE AUTHOR NOTE
18+
* ---------------------------------------------------------------------------------------------------------------------
19+
* 26. 1. 7. Baekgwa Initial creation
20+
*/
21+
public class 출석체크 {
22+
public class Main {
23+
24+
// 학생수 N
25+
// 졸고 있는 학생 수 K
26+
// 출석 코드를 보낼 학생의 수(시작) Q
27+
// 주어질 구간의 수 M
28+
// N K Q M
29+
// 10 1 3 1
30+
// 7 -> 졸고 있는 학생의 입장 번호
31+
// 3 5 7 -> 출석 코드를 받는 학생들의 입장 번호
32+
// 출석을 못한 학생수를 구할 구간
33+
// 3 12
34+
35+
// 그럼
36+
// 3 4 5 6 7 8 9 10 11 12
37+
// O X O O X X O O X O
38+
// 0 1 1 1 2 3 3 3 4 4
39+
40+
public static void main(String[] args) throws Exception {
41+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
42+
StringTokenizer st = new StringTokenizer(br.readLine());
43+
44+
int N = Integer.parseInt(st.nextToken()); // 학생 수
45+
int K = Integer.parseInt(st.nextToken()); // 졸고 있는 학생 수
46+
int Q = Integer.parseInt(st.nextToken()); // 출석코드 받는 학생 수
47+
int M = Integer.parseInt(st.nextToken()); // 구간 수
48+
49+
boolean[] sleep = new boolean[N + 3]; // 자는지 확인 용
50+
Arrays.fill(sleep, false);
51+
st = new StringTokenizer(br.readLine());
52+
for (int i = 0; i < K; i++) {
53+
int sleepNum = Integer.parseInt(st.nextToken());
54+
sleep[sleepNum] = true;
55+
}
56+
57+
List<Integer> start = new ArrayList<>();
58+
st = new StringTokenizer(br.readLine());
59+
for (int i = 0; i < Q; i++) {
60+
int startNum = Integer.parseInt(st.nextToken());
61+
start.add(startNum);
62+
}
63+
64+
// 전체 확인 처리
65+
boolean[] map = new boolean[N + 3];
66+
for (int sta : start) {
67+
if (sleep[sta])
68+
continue; // 처음 받는놈이 자면 패스
69+
70+
for (int i = sta; i <= N + 2; i += sta) {
71+
if (sleep[i])
72+
continue;
73+
74+
map[i] = true;
75+
}
76+
}
77+
78+
// 미리 누적합 구해두기
79+
int[] result = new int[N + 3];
80+
for (int i = 3; i <= N + 2; i++) {
81+
result[i] = result[i - 1] + (map[i] ? 0 : 1);
82+
}
83+
84+
StringBuilder sb = new StringBuilder();
85+
for (int i = 0; i < M; i++) {
86+
st = new StringTokenizer(br.readLine());
87+
int S = Integer.parseInt(st.nextToken()); //범위 시작
88+
int E = Integer.parseInt(st.nextToken()); //범위 종료
89+
90+
int count = result[E] - result[S-1];
91+
sb.append(count).append("\n");
92+
}
93+
94+
System.out.println(sb);
95+
}
96+
}
97+
}

0 commit comments

Comments
 (0)