Skip to content

Commit de8b312

Browse files
authored
Merge pull request #110 from yeongleej/main
[8주차] 이지영
2 parents edf565c + 7d2f318 commit de8b312

File tree

7 files changed

+395
-0
lines changed

7 files changed

+395
-0
lines changed

BOJ/1000-5000번/JY_1911.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package day1029;
2+
3+
import java.io.*;
4+
import java.util.*;
5+
6+
public class JY_1911 {
7+
8+
static int N, L;
9+
static long[][] hrr;
10+
11+
public static void main(String[] args) throws IOException {
12+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13+
StringTokenizer st = new StringTokenizer(br.readLine());
14+
15+
N = Integer.parseInt(st.nextToken());
16+
L = Integer.parseInt(st.nextToken());
17+
18+
hrr = new long[N][2];
19+
for(int i=0; i<N; i++) {
20+
st = new StringTokenizer(br.readLine());
21+
hrr[i][0] = Integer.parseInt(st.nextToken());
22+
hrr[i][1] = Integer.parseInt(st.nextToken());
23+
}
24+
25+
// 물웅덩이 위치순으로 정렬
26+
Arrays.sort(hrr, (o1, o2)->Long.compare(o1[0], o2[0]));
27+
28+
long s = 0;
29+
long e = hrr[N-1][1]; // 최대의 널빤지수 == L이 1이고, 가장 마지막 물웅덩이까지 다 덮을 때
30+
long cnt = 0;
31+
32+
while(s <= e) {
33+
long mid = (s + e) / 2;
34+
35+
if(isPossible(mid)) {
36+
cnt = mid;
37+
e = mid - 1;
38+
}else {
39+
s = mid + 1;
40+
}
41+
}
42+
43+
System.out.println(cnt);
44+
45+
}
46+
public static boolean isPossible(long mid) {
47+
long pre = 0; // 마지막 널빤지 위치
48+
long total = 0; // 총 필요한 널빤지 개수
49+
for(int i=0; i<N; i++) {
50+
long[] now = hrr[i];
51+
// 현재 물웅덩이 시작점에 널빤지 없다면 새로운 널빤지 시작점
52+
if(pre < now[0]) {
53+
pre = now[0];
54+
}
55+
56+
// 물 웅덩이 크기
57+
long size = now[1] - pre;
58+
if(size <= 0) continue;
59+
60+
// 필요한 널빤지 개수
61+
long cnt = (size / L);
62+
if(size % L != 0) cnt++;
63+
total += cnt;
64+
if(total > mid) return false;
65+
66+
pre = pre + cnt * L; // 마지막 널빤지 위치 갱신
67+
}
68+
69+
return true;
70+
}
71+
72+
}

BOJ/1000-5000번/JY_2461.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package day1031;
2+
3+
import java.io.*;
4+
import java.util.*;
5+
6+
public class JY_2461 {
7+
8+
public static void main(String[] args) throws IOException{
9+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
10+
StringTokenizer st = new StringTokenizer(br.readLine());
11+
12+
int N = Integer.parseInt(st.nextToken());
13+
int M = Integer.parseInt(st.nextToken());
14+
15+
int[][] srr = new int[N][M];
16+
for(int i=0; i<N; i++) {
17+
st = new StringTokenizer(br.readLine());
18+
for(int j=0; j<M; j++) {
19+
srr[i][j] = Integer.parseInt(st.nextToken());
20+
}
21+
}
22+
23+
// 각 반 정렬
24+
for(int i=0; i<N; i++) {
25+
Arrays.sort(srr[i]);
26+
}
27+
28+
// 각 반의 학생 인덱스 포인터 배열
29+
int[] n = new int[N];
30+
31+
int ans = Integer.MAX_VALUE;
32+
while(true) {
33+
int max = Integer.MIN_VALUE;
34+
int min = Integer.MAX_VALUE;
35+
int minIdx = -1;
36+
37+
// 각 반 반복
38+
for(int i=0; i<N; i++) {
39+
int j = n[i]; // 각 반이 현재 가리키고 있는 학생
40+
if(max < srr[i][j]) {
41+
max = srr[i][j];
42+
}
43+
if(min > srr[i][j]) {
44+
min = srr[i][j];
45+
minIdx = i;
46+
}
47+
}
48+
49+
ans = Math.min(ans, max-min);
50+
n[minIdx]++;
51+
if(n[minIdx] == M) break;
52+
53+
}
54+
55+
System.out.println(ans);
56+
57+
}
58+
59+
60+
}

BOJ/20001-25000번/JY_20007.java

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package day1030;
2+
3+
import java.io.*;
4+
import java.util.*;
5+
6+
public class JY_20007 {
7+
8+
static long INF = Long.MAX_VALUE;
9+
static int N, M, X, Y;
10+
static List<Node>[] g;
11+
static long[] distance;
12+
static class Node implements Comparable<Node> {
13+
int n;
14+
long dist;
15+
16+
public Node(int n, long dist) {
17+
super();
18+
this.n = n;
19+
this.dist = dist;
20+
}
21+
@Override
22+
public int compareTo(Node other) {
23+
return Long.compare(this.dist, other.dist);
24+
}
25+
26+
@Override
27+
public String toString() {
28+
return "Node [n=" + n + ", dist=" + dist + "]";
29+
}
30+
31+
}
32+
33+
public static void main(String[] args) throws IOException {
34+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
35+
StringTokenizer st = new StringTokenizer(br.readLine());
36+
37+
N = Integer.parseInt(st.nextToken());
38+
M = Integer.parseInt(st.nextToken());
39+
X = Integer.parseInt(st.nextToken());
40+
Y = Integer.parseInt(st.nextToken());
41+
42+
g = new ArrayList[N];
43+
for(int i=0; i<N; i++) {
44+
g[i] = new ArrayList<>();
45+
}
46+
47+
distance = new long[N];
48+
for(int i=0; i<N; i++) {
49+
distance[i] = INF;
50+
}
51+
52+
for(int i=0; i<M; i++) {
53+
st = new StringTokenizer(br.readLine());
54+
int a = Integer.parseInt(st.nextToken());
55+
int b = Integer.parseInt(st.nextToken());
56+
int c = Integer.parseInt(st.nextToken());
57+
g[a].add(new Node(b, c));
58+
g[b].add(new Node(a, c));
59+
}
60+
61+
dijkstra(Y);
62+
63+
Arrays.sort(distance);
64+
65+
// System.out.println(Arrays.toString(distance));
66+
67+
// 갈 수없는 곳 찾기
68+
for(int i=N-1; i>=0; i--) {
69+
if(2*distance[i] > X) {
70+
System.out.println(-1);
71+
return;
72+
}
73+
}
74+
75+
// 투포인터 이거 왜안되죠???
76+
// X= 21, distance = [0, 1, 1, 9, 9]이면 최소일수는 2일아닌가요??!! ㅠ0ㅠ
77+
// int s = 0;
78+
// int e = N-1;
79+
// long sum = 2*distance[e];
80+
// while(s <= e) {
81+
// if(sum + 2*distance[s] <= X) {
82+
// sum += 2*distance[s];
83+
// s++;
84+
// } else {
85+
// e--;
86+
// ans++;
87+
// sum = 2*distance[e];
88+
// }
89+
// }
90+
91+
int ans = 1;
92+
long sum = 0;
93+
for(int i=0; i<N; i++) {
94+
if(sum + 2*distance[i] > X) {
95+
ans++;
96+
sum = 2*distance[i];
97+
} else {
98+
sum += 2*distance[i];
99+
}
100+
}
101+
102+
System.out.println(ans);
103+
104+
}
105+
public static void dijkstra(int start) {
106+
distance[start] = 0;
107+
PriorityQueue<Node> pq = new PriorityQueue<>();
108+
pq.add(new Node(start, 0));
109+
110+
while(!pq.isEmpty()) {
111+
Node now = pq.poll();
112+
113+
if(distance[now.n] < now.dist) continue;
114+
115+
for(Node next: g[now.n]) {
116+
long cost = now.dist + next.dist;
117+
if(distance[next.n] > cost) {
118+
distance[next.n] = cost;
119+
pq.add(new Node(next.n, cost));
120+
}
121+
}
122+
}
123+
}
124+
125+
}

BOJ/5001-10000번/JY_9342.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package day1029;
2+
3+
import java.io.*;
4+
import java.util.*;
5+
6+
public class JY_9342 {
7+
8+
static boolean isOk;
9+
10+
public static void main(String[] args) throws IOException {
11+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
13+
int T = Integer.parseInt(br.readLine());
14+
for(int t=0; t<T; t++) {
15+
String str = br.readLine();
16+
17+
isOk = false;
18+
isGen(str, 0, 0);
19+
if(!isOk) System.out.println("Good");
20+
else System.out.println("Infected!");
21+
}
22+
23+
}
24+
/*
25+
* << type >> 규칙
26+
* 0 : 문자열은 {A, B, C, D, E, F} 중 0개 또는 1개로 시작해야 한다.
27+
* 1 : 그 다음에는 A가 하나 또는 그 이상 있어야 한다.
28+
* 2 : 그 다음에는 F가 하나 또는 그 이상 있어야 한다.
29+
* 3 : 그 다음에는 C가 하나 또는 그 이상 있어야 한다.
30+
* 4 : 그 다음에는 {A, B, C, D, E, F} 중 0개 또는 1개가 있으며, 더 이상의 문자는 없어야 한다.
31+
* */
32+
public static void isGen(String s, int idx, int type) {
33+
if(type == 0) {
34+
if(s.charAt(idx) >= 'A' && s.charAt(idx) <= 'F') {
35+
if(s.charAt(idx) == 'A') isGen(s, idx, 1); // 다음 조건도 A로 시작하므로 인덱스 증가X
36+
else isGen(s, idx+1, 1);
37+
}
38+
} else if(type == 1) {
39+
int next = check(s, idx, 'A');
40+
if(next != -1) {
41+
isGen(s, next, 2);
42+
}
43+
} else if(type == 2) {
44+
int next = check(s, idx, 'F');
45+
if(next != -1) {
46+
isGen(s, next, 3);
47+
}
48+
} else if(type == 3) {
49+
int next = check(s, idx, 'C');
50+
if(next != -1) {
51+
isGen(s, next, 4);
52+
}
53+
} else {
54+
if(idx == s.length()) isOk = true;
55+
else if(idx == s.length()-1 && s.charAt(idx) >= 'A' && s.charAt(idx) <= 'F') {
56+
isOk = true;
57+
}
58+
}
59+
}
60+
public static int check(String s, int idx, char c) {
61+
int i = idx;
62+
while(i < s.length()) {
63+
if(s.charAt(i) != c) break;
64+
i++;
65+
}
66+
if(i > idx) {
67+
return i;
68+
}
69+
return -1;
70+
}
71+
72+
}

Programmers/Level2/JY_150369.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
public long solution(int cap, int n, int[] deliveries, int[] pickups) {
5+
long answer = 0;
6+
7+
int i = n-1;
8+
while(i >= 0) {
9+
System.out.println("i: "+i);
10+
System.out.println("d: "+Arrays.toString(deliveries));
11+
System.out.println("p: "+Arrays.toString(pickups));
12+
13+
// 배달과 수거 모두 끝난 집은 pass
14+
if(deliveries[i] ==0 && pickups[i] ==0){
15+
i--;
16+
continue;
17+
}
18+
19+
// 현재 가장 먼 집위치
20+
int start = i+1;
21+
22+
// 배달하기
23+
int capD = cap;
24+
int d = i;
25+
while(d >= 0) {
26+
if(capD < deliveries[d]) {
27+
deliveries[d] -= capD;
28+
break;
29+
}
30+
capD -= deliveries[d];
31+
deliveries[d] = 0;
32+
d--;
33+
}
34+
35+
// 수거하기
36+
int capP = cap;
37+
int p = i;
38+
while(p >= 0) {
39+
if(capP < pickups[p]) {
40+
pickups[p] -= capP;
41+
break;
42+
}
43+
capP -= pickups[p];
44+
pickups[p] = 0;
45+
p--;
46+
}
47+
48+
answer += (start*2);
49+
}
50+
51+
return answer;
52+
}
53+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-- 550. Game Play Analysis IV
2+
-- https://leetcode.com/problems/game-play-analysis-iv/?envType=study-plan-v2&envId=top-sql-50
3+
SELECT ROUND(COUNT(DISTINCT A.player_id) / (SELECT COUNT(DISTINCT player_id) FROM activity), 2) AS fraction
4+
FROM activity A
5+
JOIN activity B
6+
on A.player_id = B.player_id
7+
WHERE (A.player_id, A.event_date) in (SELECT player_id, min(event_date) FROM activity group by player_id) AND DATEDIFF(B.event_date, A.event_date) = 1

0 commit comments

Comments
 (0)