※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1256번 문제인 사전이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1256
1256번: 사전
첫째 줄에 N, M, K가 순서대로 주어진다. N과 M은 100보다 작거나 같은 자연수이고, K는 1,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
문자열을 맨 앞에서부터 작성해나갈 때, a를 지금 썼다고 가정할 시 뒤에 나올 수 있는 문자열의 경우의 수보다 K가 큰지 작은지에 따라 a를 쓸지 z를 쓸지 결정해나갈 수 있다.
사용할 수 있는 z를 모두 썼을 때 K값이 1(a만을 채우는 경우)이 아니라면 이는 가능한 전체 경우의 수보다 K가 크게 주어진 것이므로 -1을 출력한다.
그렇지 않은 경우 문자열을 완성하여 출력한다.
200개 중 100개를 고르는 경우의 수는 64비트 정수 자료형으로도 담을 수 없음에 유의하여 구현하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
int comb[201][201];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (int i = 1; i <= 200; i++) {
comb[i][0] = comb[i][i] = 1;
}
for (int i = 2; i <= 200; i++) {
for (int j = 1; j < i; j++) {
comb[i][j] = min(comb[i - 1][j - 1] + comb[i - 1][j], 1000000001);
}
}
string ans = "";
int N, M, K; cin >> N >> M >> K;
while (M > 0) {
if (K > comb[N + M - 1][M]) {
K -= comb[N + M - 1][M];
M--;
ans += "z";
}
else {
N--;
ans += "a";
}
}
if (M == 0) {
if (K != 1) {
cout << -1;
return 0;
}
}
while (N > 0) {
ans += "a";
N--;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 5406 // C++] No Smoking, Please (0) | 2021.08.10 |
---|---|
[BOJ 3000 // C++] 직각 삼각형 (0) | 2021.08.09 |
[BOJ 13140 // C++] Hello World! (0) | 2021.08.07 |
[BOJ 1939 // C++] 중량제한 (0) | 2021.08.06 |
[BOJ 15918 // C++] 랭퍼든 수열쟁이야!! (0) | 2021.08.05 |