๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1561
โธ ๋ฌธ์
N๋ช ์ ์์ด๋ค์ด ํ ์ค๋ก ์ค์ ์์ ๋์ด๊ณต์์์ 1์ธ์น ๋์ด๊ธฐ๊ตฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค. ์ด ๋์ด๊ณต์์๋ ์ด M์ข ๋ฅ์ 1์ธ์น ๋์ด๊ธฐ๊ตฌ๊ฐ ์์ผ๋ฉฐ, 1๋ฒ๋ถํฐ M๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค.
๋ชจ๋ ๋์ด๊ธฐ๊ตฌ๋ ๊ฐ๊ฐ ์ดํ ์๊ฐ์ด ์ ํด์ ธ ์์ด์, ์ดํ ์๊ฐ์ด ์ง๋๋ฉด ํ์นํ๊ณ ์๋ ์์ด๋ ๋ด๋ฆฌ๊ฒ ๋๋ค. ๋์ด ๊ธฐ๊ตฌ๊ฐ ๋น์ด ์์ผ๋ฉด ํ์ฌ ์ค์์ ๊ฐ์ฅ ์์ ์ ์๋ ์์ด๊ฐ ๋น ๋์ด๊ธฐ๊ตฌ์ ํ์นํ๋ค. ๋ง์ผ ์ฌ๋ฌ ๊ฐ์ ๋์ด๊ธฐ๊ตฌ๊ฐ ๋์์ ๋น์ด ์์ผ๋ฉด, ๋ ์์ ๋ฒํธ๊ฐ ์ ํ ์๋ ๋์ด๊ธฐ๊ตฌ๋ฅผ ๋จผ์ ํ์นํ๋ค๊ณ ํ๋ค.
๋์ด๊ธฐ๊ตฌ๊ฐ ๋ชจ๋ ๋น์ด ์๋ ์ํ์์ ์ฒซ ๋ฒ์งธ ์์ด๊ฐ ๋์ด๊ธฐ๊ตฌ์ ํ์นํ๋ค๊ณ ํ ๋, ์ค์ ๋ง์ง๋ง ์์ด๊ฐ ํ๊ฒ ๋๋ ๋์ด๊ธฐ๊ตฌ์ ๋ฒํธ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 2,000,000,000)๊ณผ M(1 ≤ M ≤ 10,000)์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ๊ฐ ๋์ด๊ธฐ๊ตฌ์ ์ดํ ์๊ฐ์ ๋ํ๋ด๋ M๊ฐ์ ์์ฐ์๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ดํ ์๊ฐ์ 1 ์ด์ 30 ์ดํ์ ์์ฐ์์ด๋ฉฐ, ๋จ์๋ ๋ถ์ด๋ค.
โธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ง์ง๋ง ์์ด๊ฐ ํ๊ฒ ๋๋ ๋์ด๊ธฐ๊ตฌ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 1
- ๐ ๋ฌธ์ ์ ํ : ์ด๋ถ ํ์, ๋งค๊ฐ ๋ณ์ ํ์
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ๋ ๋จ์ํ ์ ํ ํ์์ผ๋ก ์ ๊ทผํ๋ฉด, ์์ด๋ค์ ์๊ฐ ์ต๋ 20์ต ๋ช ๊น์ง ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ ์ด๋ถ ํ์์ ํ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
โฑ ์์ด๋ค์ด ํ์นํ ์ธ์์ ์๊ฐ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํ๊ธฐ
ํต์ฌ ์์ด๋์ด๋, ํน์ ์๊ฐ t๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ์์ ๊น์ง ๋ช ๋ช ์ ์์ด๊ฐ ๋์ด๊ธฐ๊ตฌ๋ฅผ ํ๋์ง ๊ณ์ฐํ๋ ๊ฒ์ด๋ค.
- 0๋ถ์๋ ๋ชจ๋ ๋์ด๊ธฐ๊ตฌ๊ฐ ํ ๋ฒ์ฉ ์ดํ์ ์์ํ๋ฏ๋ก, ์ฒ์ m๋ช ์ ์์ด๋ค์ด ์ฆ์ ํ์นํ๋ค.
- ์ดํ ๊ฐ ๋์ด๊ธฐ๊ตฌ๋ ์์ ์ ์ดํ ์๊ฐ์ด ์ง๋ ๋๋ง๋ค ๋ฐ๋ณต์ ์ผ๋ก ์์ด๋ค์ ํ์ธ ์ ์๊ธฐ ๋๋ฌธ์, ๊ฐ ๋์ด๊ธฐ๊ตฌ๋ t / time[i]๋งํผ์ ์์ด๋ฅผ ์ถ๊ฐ๋ก ํ์ธ ์ ์๋ค.
private static long getChildNumInTime(long t) {
long childNum = m;
for (int i = 0; i < m; i++) {
childNum += t/time[i];
}
return childNum;
}
๐ง ์ด๋ถ ํ์์ผ๋ก ์ต์ ์๊ฐ ์ฐพ๊ธฐ
๊ทธ๋ผ ์ด์ N๋ฒ์งธ ์์ด๊ฐ ๋์ด๊ธฐ๊ตฌ๋ฅผ ํ ์ ์๋ ์ต์ ์๊ฐ์ ์ด๋ถ ํ์์ผ๋ก ์ฐพ์์ผ ํ๋ค.
- ๋ชจ๋ ์์ด๋ค์ด ๋์ด๊ธฐ๊ตฌ๋ฅผ ํ๋ ๋ฐ ๊ฑธ๋ฆด ์ ์๋ ์ต๋ ์๊ฐ์ n * 30๋ถ์ผ๋ก ์ค์ ํ ์ ์๋ค.
- ๊ฐ์ฅ ๊ทน๋จ์ ์ ์ํฉ์ธ 20์ต ๋ช ์ ์์ด๋ค์ด ์ดํ ์๊ฐ์ด 30๋ถ์ธ 1๊ฐ์ ๋์ด๊ธฐ๊ตฌ๋ง ์ด์ฉํ๋ ๊ฒฝ์ฐ
- ์ด๋ถ ํ์์ ํตํด ํด๋น ์๊ฐ ์์ n๋ช ์ด์์ด ํ์น ๊ฐ๋ฅํ์ง๋ฅผ ์ฒดํฌํ๋ฉด ๋ฒ์๋ฅผ ์ขํ๋๊ฐ๋ค.
private static long binarySearch() {
long left = 0;
long right = n*30;
while (left <= right) {
long mid = (left+right)/2;
long childNum = getChildNumInTime(mid);
if (childNum < n) {
left = mid+1;
} else {
right = mid-1;
}
}
return left;
}
- getChildNumInTime(mid)๋ mid ์์ ๊น์ง ๋์ด๊ธฐ๊ตฌ๋ฅผ ํ ์์ด๋ค์ ์ด ์๋ฅผ ๋ฐํํ๋ค.
- ์ด ๊ฐ์ด n๋ณด๋ค ์์ผ๋ฉด ์์ง N๋ฒ์งธ ์์ด๊ฐ ํ ์ ์๋ ์๊ฐ์ด๋ฏ๋ก left๋ฅผ ๋๋ฆฌ๊ณ ,
- ๊ทธ๋ ์ง ์๋ค๋ฉด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์๊ฐ์ด๋ฏ๋ก right๋ฅผ ์ค์ฌ ๋ ๋น ๋ฅธ ์๊ฐ๋๋ฅผ ํ์ํ๋ค.
์ต์ข ์ ์ผ๋ก left์๋ N๋ฒ์งธ ์์ด๊ฐ ํ์น ๊ฐ๋ฅํ ์ต์ ์๊ฐ t๊ฐ ๋ด๊ธฐ๊ฒ ๋๋ค.
๐ฏ ๋ง์ง๋ง ์์ด๊ฐ ํ ๋์ด๊ธฐ๊ตฌ ์ฐพ๊ธฐ
์ด์ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์ถ์ ๊ฒ์, N๋ฒ์งธ ์์ด๊ฐ ์ด๋ค ๋์ด๊ธฐ๊ตฌ๋ฅผ ํ๋์ง์ด๋ค.
- ๋จผ์ t-1 ์์ ๊น์ง ๋์ด๊ธฐ๊ตฌ๋ฅผ ํ ์์ด๋ค์ ์๋ฅผ ๊ณ์ฐํ๋ค.
- ์ด์ t ์์ ์์ ๋น๊ฒ ๋๋ ๋์ด๊ธฐ๊ตฌ๋ค์ ์ฐจ๋ก๋ก ํ์ธํ๋ฉด์, ์์ด๋ค์ ์์๋๋ก ํ์ด๋ค.
- ๊ทธ์ค N๋ฒ์งธ ์์ด๊ฐ ํ์นํ๊ฒ ๋๋ ์๊ฐ, ํด๋น ๋์ด๊ธฐ๊ตฌ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
long child = getChildNumInTime(min-1); // min์ ์ต์ ์๊ฐ
for (int i = 0; i < m; i++) {
if (result%time[i] == 0) {
child++;
}
if (child == n) {
System.out.println(i+1);
break;
}
}
- result%time[i] == 0์ด๋ผ๋ ์กฐ๊ฑด์ ๋์ด๊ธฐ๊ตฌ i๊ฐ t ์์ ์ ์์ด๋ฅผ ํ์ธ ์ ์๋ ์ํ์์ ์๋ฏธํ๋ค.
- ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋์ด๊ธฐ๊ตฌ๋ค์ ๋ฒํธ์์ผ๋ก ํ์ธํ๋ฉด์ ์์ด๋ฅผ ํ์ด๋ค.
- ๋์ ํ ์์ด ์๊ฐ n๋ฒ์งธ๊ฐ ๋๋ ์๊ฐ, ํด๋น ๋์ด๊ธฐ๊ตฌ๊ฐ ๋ฐ๋ก N๋ฒ์งธ ์์ด๊ฐ ํ์นํ ๋์ด๊ธฐ๊ตฌ๊ฐ ๋๋ค.
์ ํ์ด์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 13196KB
์๊ฐ : 108ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static long n;
static int m;
static int[] time;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Long.parseLong(st.nextToken()); // ์์ด๋ค ์
m = Integer.parseInt(st.nextToken()); // ๋์ด๊ธฐ๊ตฌ ์ข
๋ฅ
st = new StringTokenizer(br.readLine());
time = new int[m]; // ๊ฐ ๋์ด๊ธฐ๊ตฌ์ ์ดํ ์๊ฐ
for (int i = 0; i < m; i++) {
time[i] = Integer.parseInt(st.nextToken());
}
// ์์ด๋ค ์๊ฐ ๋์ด๊ธฐ๊ตฌ ์ข
๋ฅ๋ณด๋ค ์๋ค๋ฉด
// ๋ชจ๋ ๋ฐ๋ก ํ์น ๊ฐ๋ฅ
if (n <= m) {
System.out.println(n);
return;
}
long min = binarySearch(); // n๋ฒ์งธ ์์ด๊น์ง ํ์น ๊ฐ๋ฅํ ์ต์ ์๊ฐ
long child = getChildNumInTime(min-1); // n๋ฒ์งธ ์์ด๊ฐ ํ์นํ๊ธฐ ์ง์ ๊น์ง ํ์นํ ์์ด ์
for (int i = 0; i < m; i++) {
if (min%time[i] == 0) { // ๋์ด๊ธฐ๊ตฌ i๋ ์ ์์ด๋ฅผ ํ์ธ ์ค๋น๊ฐ ๋ ์ํ
child++; // ํ ๋ช
ํ์น
}
if (child == n) { // ๋ชจ๋ ํ์นํ๋ค๋ฉด
System.out.println(i+1); // ๋ง์ง๋ง ์์ด๊ฐ ํ๊ฒ ๋๋ ๋์ด๊ธฐ๊ตฌ์ ๋ฒํธ ์ถ๋ ฅ
break;
}
}
br.close();
}
private static long binarySearch() {
long left = 0; // ์ต์ ์๊ฐ
long right = n*30; // ์ต๋ ์๊ฐ, ๋ชจ๋ ์์ด๋ค์ด ๋์ด๊ธฐ๊ตฌ๋ฅผ ํ ์ ์๋ ์ต๋ ์๊ฐ
while (left <= right) {
long mid = (left+right)/2;
long childNum = getChildNumInTime(mid); // mid ๋์ ๋์ด๊ธฐ๊ตฌ๋ฅผ ํ ์ ์๋ ์์ด๋ค์ ์
if (childNum < n) {
left = mid+1;
} else {
right = mid-1;
}
}
return left;
}
private static long getChildNumInTime(long t) {
long childNum = m; // 0๋ถ์ ์์ด๋ค์ด ์ฐจ๋ก๋๋ก m๊ฐ์ ๋์ด๊ธฐ๊ตฌ ํ์น
for (int i = 0; i < m; i++) {
// ๊ฐ ๋์ด๊ธฐ๊ตฌ ๋น t๋ถ ๋์ ํ ์ ์๋ ์ธ์ ์ ๋์
childNum += t/time[i];
}
return childNum;
}
}
๋ฌธ์ ์์ ์ ๋ ฅ ๋ฒ์๊ฐ ๊ต์ฅํ ํฐ ๊ฒ์ ๋ณด๊ณ ์ด๋ถ ํ์์ ํ์ฉํด์ ํด๊ฒฐํ๋ ๋ฌธ์ ์์ ์บ์นํ๋๋ฐ, ๋ฌด์์ ๊ธฐ์ค์ผ๋ก ์ด๋ถ ํ์์ ํด์ผ ํ ์ง ๊ต์ฅํ ์ค๋ ์๊ฐ ๊ณ ๋ฏผํ๋ค. ์ฒ์์ ์ฌ๋ ์, ๋์ด ๊ธฐ๊ตฌ ์ ๋ฑ ์ฌ๋ฌ ์กฐ๊ฑด์ ๊ธฐ์ค์ผ๋ก ์ผ์๋ณด๋ ค ํ์ง๋ง ์ ์ ํ ๊ธฐ์ค์ด ์๋๋ผ๋ ์๊ฐ์ด ๋ค์๊ณ , ๊ฒฐ๊ตญ ๋ค๋ฅธ ๋ถ์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ์ฌ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ก์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค. ์ญ์ ์ด๋ถ ํ์์ ํ์ ๋์์ ์ ์ ํ๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๋ค์ ํ๋ฒ ๊นจ๋ฌ์๋ค. ๐ค๐ญ
๐ reference
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_1208] ๋ถ๋ถ์์ด์ ํฉ 2 (3) | 2025.08.10 |
---|---|
[Boj_1450] ๋ ์๋ฌธ์ (3) | 2025.08.07 |
[Boj_1194] ์์ด์คํฌ๋ฆผ ๋๋ ์งํธ (3) | 2025.08.05 |
[Boj_1194] ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์. (0) | 2025.07.25 |
[Boj_17244] ์๋ง๋ค์ฐ์ฐ (1) | 2025.07.16 |