※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 17841번 문제인 UNIST는 무엇의 약자일까?이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/17841
17841번: UNIST는 무엇의 약자일까?
P1+P2+...+PN이 UNIST가 되도록 P1, P2, ..., PN을 결정하는 경우의 수를 1,000,000,007로 나눈 나머지를 출력한다.
www.acmicpc.net
새 문자열을 받을 때마다 기존 "UNIST" 문자열을 만드는 과정에 새 문자열의 접두사(prefix)를 추가해야 한다는 점에 유의하자.
U-, UN-, UNI-, UNIS-, UNIST-, N-, NI-, NIS-, NIST-, I-, IS-, IST-, S-, ST-, T- 형태의(단, -는 뒤에 적절하게 UNIST를 잇지 못하는 다른 글자가 오거나 문자열이 끊어진 것을 의미한다) 경우의 수들을 모두 살펴 점화식을 세우는 것으로 문제를 해결할 수 있다.
코드의 형태가 유사하므로 적절히 복사와 붙여넣기를 활용하면 구현을 빠르게 할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
ll U = 0, N = 0, I = 0, S = 0, T = 0;
ll MOD = 1000000007;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int Q; cin >> Q;
while (Q--) {
string s; cin >> s;
s += "XXXXX";
if (s[0] == 'U') {
U++;
if (s[1] == 'N') {
N++;
if (s[2] == 'I') {
I++;
if (s[3] == 'S') {
S++;
if (s[4] == 'T') {
T++;
}
}
}
}
}
if (s[0] == 'N') {
N+=U;
if (s[1] == 'I') {
I+=U;
if (s[2] == 'S') {
S+=U;
if (s[3] == 'T') {
T+=U;
}
}
}
}
if (s[0] == 'I') {
I += N;
if (s[1] == 'S') {
S += N;
if (s[2] == 'T') {
T += N;
}
}
}
if (s[0] == 'S') {
S += I;
if (s[1] == 'T') {
T += I;
}
}
if (s[0] == 'T') {
T += S;
}
U %= MOD; N %= MOD; I %= MOD; S %= MOD; T %= MOD;
}
cout << T;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17845 // C++] 수강 과목 (0) | 2022.06.12 |
---|---|
[BOJ 5570 // C++] 산타클로스와 루돌프 (0) | 2022.06.12 |
[BOJ 17840 // C++] 피보나치 음악 (0) | 2022.06.12 |
[BOJ 5569 // C++] 출근 경로 (0) | 2022.06.12 |
[BOJ 17843 // C++] 시계 (0) | 2022.06.12 |