Skip to content

Commit e81399a

Browse files
authored
Merge pull request #471 from AlgorithmWithGod/0224LJH
[20250715] BOJ / G1 / 놀이 공원 / 이종환
2 parents 408b2a7 + 1887e8b commit e81399a

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
```java
2+
import java.io.BufferedReader;
3+
import java.io.IOException;
4+
import java.io.InputStreamReader;
5+
import java.util.*;
6+
7+
public class Main {
8+
static int kidCnt, toyCnt, ans;
9+
static long start, end,minTime;
10+
static int[] toyTime;
11+
12+
public static void main(String[] args) throws IOException {
13+
init();
14+
process();
15+
print();
16+
}
17+
18+
private static void init() throws IOException {
19+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
20+
StringTokenizer st = new StringTokenizer(br.readLine());
21+
kidCnt = Integer.parseInt(st.nextToken());
22+
toyCnt = Integer.parseInt(st.nextToken());
23+
toyTime = new int[toyCnt];
24+
25+
start = 0;
26+
end = 2000_000_000_00l;
27+
28+
st = new StringTokenizer(br.readLine());
29+
for (int i = 0; i < toyCnt; i++) {
30+
toyTime[i] = Integer.parseInt(st.nextToken());
31+
}
32+
}
33+
34+
private static void process() {
35+
if (kidCnt <= toyCnt) {
36+
ans = kidCnt;
37+
return;
38+
}
39+
40+
//마지막 사람이 탑승하는 시간 구함
41+
calculateProperTime();
42+
43+
int curKidCnt = 0;
44+
List<Integer> minRemainIdx = new ArrayList<>();
45+
int minRemain = 30;
46+
47+
for (int i = 0; i < toyCnt; i++) {
48+
curKidCnt += minTime / toyTime[i] + 1;
49+
50+
if (minRemain > minTime % toyTime[i]) {
51+
minRemain = (int) (minTime % toyTime[i]);
52+
minRemainIdx = new ArrayList<>();
53+
minRemainIdx.add(i);
54+
} else if (minRemain == minTime % toyTime[i]) {
55+
minRemainIdx.add(i);
56+
}
57+
}
58+
59+
if (curKidCnt == kidCnt){
60+
ans = minRemainIdx.get(minRemainIdx.size()-1)+1;
61+
} else{
62+
int diff = (curKidCnt - kidCnt)%minRemainIdx.size();
63+
ans = minRemainIdx.get(minRemainIdx.size()-1-diff) + 1;
64+
}
65+
66+
}
67+
68+
private static void calculateProperTime() {
69+
long mid = ((start + end) / 2);
70+
minTime = Long.MAX_VALUE;
71+
72+
73+
while (start < end) {
74+
75+
//이번 탐색에서 놀이기구를 이용한 총 인원
76+
long peopleCnt = 0;
77+
78+
for (int i = 0; i < toyCnt; i++) {
79+
//총시간을 각 놀이기구 이용시간으로 나눈 몫 + 1;
80+
peopleCnt += mid/toyTime[i] + 1;
81+
}
82+
83+
// 크거나 같음 -> 암튼 이 시간내에 꼬마들이 다 이용함.
84+
if(peopleCnt >= kidCnt) {
85+
if (mid < minTime) {
86+
minTime = mid;
87+
end = mid;
88+
}
89+
90+
if (peopleCnt == kidCnt){
91+
minTime = mid;
92+
break;
93+
}
94+
} else {
95+
// 목표보다 아이들이 이용 못함 -> 더 큰쪽 조사
96+
start = mid+1;
97+
}
98+
99+
mid = ((start + end) / 2);
100+
}
101+
102+
103+
}
104+
105+
106+
private static void print() {
107+
System.out.println(ans);
108+
}
109+
110+
111+
112+
}
113+
114+
```

0 commit comments

Comments
 (0)