Skip to content

Commit d405b56

Browse files
authored
Merge pull request #951 from AlgorithmWithGod/zinnnn37
[20250922] BOJ / G4 / 점심메뉴 / 김민진
2 parents 9723289 + 3c6ed66 commit d405b56

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
```java
2+
import java.io.*;
3+
import java.util.Arrays;
4+
import java.util.StringTokenizer;
5+
6+
public class BJ_12099_점심메뉴 {
7+
8+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
10+
private static final StringBuilder sb = new StringBuilder();
11+
private static StringTokenizer st;
12+
13+
private static int N;
14+
private static int Q;
15+
16+
private static Node[] taste;
17+
private static int[] sweetness;
18+
19+
private static class Node implements Comparable<Node> {
20+
int spiciness;
21+
int sweetness;
22+
23+
Node(int s, int w) {
24+
spiciness = s;
25+
sweetness = w;
26+
}
27+
28+
@Override
29+
public int compareTo(Node o) {
30+
return Integer.compare(this.spiciness, o.spiciness);
31+
}
32+
}
33+
34+
public static void main(String[] args) throws IOException {
35+
init();
36+
sol();
37+
}
38+
39+
private static void init() throws IOException {
40+
st = new StringTokenizer(br.readLine());
41+
N = Integer.parseInt(st.nextToken());
42+
Q = Integer.parseInt(st.nextToken());
43+
44+
taste = new Node[N];
45+
for (int i = 0; i < N; i++) {
46+
st = new StringTokenizer(br.readLine());
47+
48+
int s = Integer.parseInt(st.nextToken());
49+
int w = Integer.parseInt(st.nextToken());
50+
51+
taste[i] = new Node(s, w);
52+
}
53+
54+
Arrays.sort(taste);
55+
}
56+
57+
private static void sol() throws IOException {
58+
while (Q-- > 0) {
59+
st = new StringTokenizer(br.readLine());
60+
61+
int s1 = Integer.parseInt(st.nextToken());
62+
int s2 = Integer.parseInt(st.nextToken());
63+
int w1 = Integer.parseInt(st.nextToken());
64+
int w2 = Integer.parseInt(st.nextToken());
65+
66+
int left = lowerBound(s1);
67+
int right = upperBound(s2);
68+
69+
if (left >= right) {
70+
sb.append("0\n");
71+
continue;
72+
}
73+
74+
int cnt = 0;
75+
for (int i = left; i < right; i++) {
76+
if (w1 <= taste[i].sweetness && taste[i].sweetness <= w2) {
77+
cnt++;
78+
}
79+
}
80+
sb.append(cnt).append("\n");
81+
}
82+
bw.write(sb.toString());
83+
bw.flush();
84+
bw.close();
85+
br.close();
86+
}
87+
88+
// s1 이상인 첫 번째 인덱스
89+
private static int lowerBound(int target) {
90+
int left = 0;
91+
int right = N;
92+
93+
while (left < right) {
94+
int mid = left + (right - left) / 2;
95+
96+
if (taste[mid].spiciness < target) {
97+
left = mid + 1;
98+
} else {
99+
right = mid;
100+
}
101+
}
102+
return left;
103+
}
104+
105+
// s2 초과인 첫 번째 인덱스
106+
private static int upperBound(int target) {
107+
int left = 0;
108+
int right = N;
109+
110+
while (left < right) {
111+
int mid = left + (right - left) / 2;
112+
113+
if (taste[mid].spiciness <= target) {
114+
left = mid + 1;
115+
} else {
116+
right = mid;
117+
}
118+
}
119+
return left;
120+
}
121+
122+
}
123+
```

0 commit comments

Comments
 (0)