๐ฏ ๋ฌธ์ ์์ฝ
- ๊ธธ์ด๊ฐ N์ธ ์ด์ง์ ์ค์์ 1์ ๊ฐ์๊ฐ L ์ดํ์ธ ์ด์ง์๋ค์ ์ฌ์ ์์ผ๋ก ์ ๋ ฌํ์ ๋, K๋ฒ์งธ ์ด์ง์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
๐ง ๋ฌธ์ ์ ๊ทผ
์ด ๋ฌธ์ ๋ ๋ชจ๋ ์ด์ง์๋ฅผ ์ง์ ๋ง๋ค์ด์ K๋ฒ์งธ๋ฅผ ์ฐพ๊ธฐ์๋ ๋นํจ์จ์
ํต์ฌ ์์ด๋์ด๋ ์กฐํฉ์ ์ด์ฉํด ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ฉฐ ์๋ฆฟ์๋ฅผ ๊ฒฐ์
๐ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
โ ์กฐํฉ ๋ฏธ๋ฆฌ ๊ณ์ฐ
comb[n][k] = nCk (n๊ฐ ์ค k๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์)
ํ์ค์นผ ์ผ๊ฐํ์ ํ์ฉํ์ฌ ์กฐํฉ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํฉ๋๋ค.
for (int i = 0; i <= 32; i++) {
comb[i][0] = comb[i][i] = 1;
for (int j = 1; j < i; j++) {
comb[i][j] = comb[i - 1][j - 1] + comb[i - 1][j];
}
}
โ ์๋ฆฌ์ ๋ณ ๋ถ๊ธฐ
- i๋ฒ์งธ ์๋ฆฌ๋ฅผ '0'์ผ๋ก ์ฑ์ธ ๊ฒฝ์ฐ → ๋๋จธ์ง ์๋ฆฌ์์ 1์ด L๊ฐ ์ดํ์ธ ๊ฒฝ์ฐ์ ์ = comb[i - 1][0] + ... + comb[i - 1][L]
- ๋ง์ฝ ์ด ๊ฐ๋ณด๋ค K๊ฐ ์๊ฑฐ๋ ๊ฐ๋ค๋ฉด ํ์ฌ ์๋ฆฌ๋ '0'
- ์๋๋ผ๋ฉด ํ์ฌ ์๋ฆฌ๋ '1', K์์ ํด๋น ๊ฒฝ์ฐ์ ์๋งํผ ๋นผ๊ณ , L--
๐ป ์ ์ฒด ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N, L;
static long K;
static long[][] comb = new long[33][33];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // ์ด์ง์ ๊ธธ์ด
L = Integer.parseInt(st.nextToken()); // 1์ ๊ฐ์ ์ ํ
K = Long.parseLong(st.nextToken()); // K๋ฒ์งธ ์ด์ง์
initComb(); // ์กฐํฉ ํ
์ด๋ธ ์ด๊ธฐํ
StringBuilder result = new StringBuilder();
int onesLeft = L;
long order = K;
for (int i = N; i > 0; i--) {
long zeroCount = countValid(i - 1, onesLeft); // ์์๋ฆฌ๋ฅผ 0์ผ๋ก ์์ํ ์ ์๋ ๊ฒฝ์ฐ์ ์
if (order <= zeroCount) {
result.append('0');
} else {
result.append('1');
order -= zeroCount;
onesLeft--;
}
}
System.out.print(result);
}
// ์กฐํฉ ๊ณ์ฐ (nCk)
static void initComb() {
for (int i = 0; i <= 32; i++) {
comb[i][0] = 1;
comb[i][i] = 1;
}
for (int i = 1; i <= 32; i++) {
for (int j = 1; j < i; j++) {
comb[i][j] = comb[i - 1][j - 1] + comb[i - 1][j];
if (comb[i][j] > 1_000_000_000) comb[i][j] = 1_000_000_000; // overflow ๋ฐฉ์ง
}
}
}
// i์๋ฆฌ ์ดํ์์ 1์ด max๊ฐ ์ดํ์ธ ์ด์ง์ ๊ฐ์
static long countValid(int digit, int maxOne) {
long sum = 0;
for (int i = 0; i <= maxOne; i++) {
sum += comb[digit][i];
}
return sum;
}
}
โ ์๊ฐ๋ณต์ก๋
| ๋จ๊ณ | ๋ณต์ก๋ |
|---|---|
| ์กฐํฉ ๊ณ์ฐ | O(N^2) |
| ์ด์ง์ ์์ฑ | O(N) |
๐ก ์ ๋ฆฌ
- ๋จ์ํ๊ฒ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ, ์กฐํฉ์ผ๋ก ๊ฒฝ์ฐ์ ์๋ฅผ ์ธ๋ฉฐ ์ฌ์ ์์ผ๋ก ๊ฒฐ์ ํด์ผ ํ๋ ๋ฌธ์
- ์ด์ง์ ์์ฑ ๋ฌธ์ ์์ ์์ฃผ ์ฐ์ด๋ ๋ํ ํจํด
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฐฑ์ค 2306: ์ ์ ์(Java) (1) | 2025.06.12 |
|---|---|
| ๋ฐฑ์ค 1557: ๋๋ก์ ๊ฐ์(Java) (1) | 2025.06.11 |
| ๋ฐฑ์ค 10800๋ฒ: ์ปฌ๋ฌ๋ณผ (Java) (1) | 2025.06.04 |
| ๋ฐฑ์ค 2294: ๋์ 2(Java) (1) | 2025.06.02 |
| ๋ฐฑ์ค 1167: ํธ๋ฆฌ์ ์ง๋ฆ(Java) (0) | 2025.05.26 |