※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 28117번 문제인 prlong longf이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/28117
28117번: prlong longf
가능한 초기 상태는 printlongf, prlongintf, prlonglonglongf로 총 3가지이다.
www.acmicpc.net
주어지는 문자열에서 "long"이 연속으로 반복하는 형태를 제외하면 원래의 문자열에서 변할 수 있는 부분은 없다. 따라서 각 연속한 "long"이 원래의 문자열에서 나타날 수 있는 경우의 수를 각각 구해 곱하는 것으로 문제를 해결할 수 있다.
"long"이 \(k>1\)개 연속한 문자열의 변화 전 문자열은 그대로 "longlong"이었거나 "int"였을 두 가지 경우로 나누어 생각할 수 있다. 각 경우의 문자열의 개수는 각각 "long"이 \(k-2\)개, \(k-1\)개 연속한 문자열의 변화 전 문자열의 수와 같으므로 이를 이용해 "long"이 \(k\)개 연속한 문자열의 변화 전 문자열의 개수를 구할 수 있다. 이는 피보나치 수열의 점화식과 같음을 확인하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
int N;
string s;
vector<int> vec;
int old = -1000000007, combo;
ll dp[21];
ll ans = 1;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
dp[0] = dp[1] = 1;
for (int i = 2; i < 21; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
cin >> N >> s;
for (int i = 0; i + 3 < N; i++) {
if (s.substr(i, 4) == "long") vec.emplace_back(i);
}
for (auto &x : vec) {
if (x == old + 4) combo++;
else {
ans *= dp[combo];
combo = 1;
}
old = x;
}
ans *= dp[combo];
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17550 // C++] Inquiry I (0) | 2024.03.13 |
---|---|
[BOJ 31589 // C++] 포도주 시음 (2) | 2024.03.12 |
[BOJ 29704 // C++] 벼락치기 (0) | 2024.03.10 |
[BOJ 26975 // C++] Cow College (0) | 2024.03.09 |
[BOJ 26596 // C++] 황금 칵테일 (0) | 2024.03.08 |