※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24956번 문제인 나는 정말 휘파람을 못 불어이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/24956 

 

24956번: 나는 정말 휘파람을 못 불어

'유사 휘파람 문자열'인 부분 수열의 개수를 $1\,000\,000\,007(= 10^9+7)$로 나눈 나머지를 출력한다.

www.acmicpc.net

문자열의 다음 문자로 W, H 또는 E가 나올 때마다 W, WH, WHE와 "유사 휘파람 문자열"을 이루는 부분수열이 새로이 몇 가지 만들어질 수 있는지를 이용하여 계산해내자.

 

예를 들어 다음 문자로 E가 나오면 완성된 "유사 휘파람 부분 수열"의 개수는 현재 기준 "WHE"의 개수와 기존 "유사 휘파람 부분 수열"의 개수만큼 증가하고 "WHE"의 개수는 현재 기준 "WH"의 개수만큼 증가한다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;

unsigned int dp[4];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int slen; string s; cin >> slen >> s;
	for (auto& l : s) {
		if (l == 'E') {
			dp[3] += dp[3] + dp[2];
			while (dp[3] > 1000000006) dp[3] -= 1000000007;
			dp[2] += dp[1];
			if (dp[2] > 1000000006) dp[2] -= 1000000007;
		}
		else if (l == 'H') {
			dp[1] += dp[0];
			if (dp[1] > 1000000006) dp[1] -= 1000000007;
		}
		else if (l == 'W') {
			dp[0]++;
		}
	}

	cout << dp[3];
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 13982 // C++] Shopping  (0) 2022.07.15
[BOJ 25025 // C++] 다항식 계산  (0) 2022.07.14
[BOJ 24955 // C++] 숫자 이어 붙이기  (0) 2022.07.12
[BOJ 4011 // C++] 기름 파기  (0) 2022.07.11
[BOJ 14713 // C++] 앵무새  (0) 2022.07.10

+ Recent posts