Skip to content

Commit 324a086

Browse files
authored
[20251019] BOJ / P4 / 날카로운 눈 / 이종환
1 parent 5024ba4 commit 324a086

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
```java
2+
import java.io.BufferedReader;
3+
import java.io.IOException;
4+
import java.io.InputStreamReader;
5+
import java.util.Arrays;
6+
import java.util.StringTokenizer;
7+
8+
public class Main {
9+
10+
static int patternCnt;
11+
static Pattern[] patterns;
12+
13+
static String ans;
14+
15+
static class Pattern {
16+
int start;
17+
int end;
18+
int plus;
19+
int numCnt;
20+
21+
public Pattern(int start, int limit, int plus) {
22+
23+
this.numCnt = (limit-start)/plus + 1;
24+
25+
this.start = start;
26+
this.end = (numCnt-1) * plus + start; // 진짜 마지막 숫자
27+
this.plus = plus;
28+
}
29+
}
30+
31+
32+
33+
34+
public static void main(String[] args) throws IOException {
35+
init();
36+
process();
37+
print();
38+
}
39+
40+
private static void init() throws IOException{
41+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
42+
patternCnt = Integer.parseInt(br.readLine());
43+
patterns = new Pattern[patternCnt];
44+
45+
for (int i = 0; i < patternCnt; i++) {
46+
StringTokenizer st = new StringTokenizer(br.readLine());
47+
int start = Integer.parseInt(st.nextToken());
48+
int limit = Integer.parseInt(st.nextToken());
49+
int plus = Integer.parseInt(st.nextToken());
50+
patterns[i] = new Pattern(start,limit,plus);
51+
}
52+
}
53+
54+
private static void process() {
55+
long totalCnt = 0;
56+
for (Pattern p: patterns) totalCnt += p.numCnt;
57+
if (totalCnt %2 == 0) {
58+
ans = "NOTHING";
59+
return;
60+
}
61+
62+
// 홀수개라면, 기준이 되는 지점을 찾으면 된다!!
63+
// 예를들어 num을 확인할 경우, num이하의 숫자의 개수를 찾는다.
64+
// num이하의 숫자가 나온 총 횟수를 f(num)이라 하자.
65+
// 1.f(num)이 짝수인 경우 -> 정답이 되는 숫자는 num보다 크다.
66+
// 2-1. f(num)이 홀수이고, num자체가 짝수개 or 존재 x -> 정답이 되는 숫자가 num보다 작다
67+
// 2-2. f(num)이 홀수이고, num자체가 홀수개 존재 -> 정답!!
68+
69+
long start = 0;
70+
long end = Integer.MAX_VALUE;
71+
long mid = (start + end)/2;
72+
73+
while (start <= mid) {
74+
long belowNumCnt = 0;
75+
long numCnt = 0;
76+
77+
78+
for (Pattern p: patterns) {
79+
if (p.end < mid) {
80+
belowNumCnt += p.numCnt;
81+
continue;
82+
} else if (p.start > mid) continue;
83+
84+
//mid가 start 이상 end이하임
85+
belowNumCnt += (mid - p.start)/p.plus + 1;
86+
if ((mid-p.start)%p.plus == 0) numCnt++;
87+
88+
}
89+
// System.out.println(mid +": " + numCnt +", 이하 총 개수:" + belowNumCnt);
90+
91+
if (numCnt % 2 != 0) { // numCnt가 홀수 -> 정답임
92+
StringBuilder sb = new StringBuilder();
93+
sb.append(mid).append(" ").append(numCnt);
94+
ans = sb.toString();
95+
return;
96+
}
97+
98+
99+
if (belowNumCnt % 2 == 0) {
100+
start = mid+1;
101+
} else {
102+
end = mid;
103+
}
104+
mid = (start + end)/2;
105+
}
106+
107+
108+
109+
}
110+
111+
private static void print() {
112+
System.out.println(ans);
113+
}
114+
115+
}
116+
```

0 commit comments

Comments
 (0)