๐Ÿ’œ๊ฐœ๋ฐœ๊ณผ ์ผ์ƒ (โ‰ง∇โ‰ฆ)๏พ‰

[๋ฐฑ์ค€ c++] 16139 ์ธ๊ฐ„-์ปดํ“จํ„ฐ ์ƒํ˜ธ์ž‘์šฉ (์‹ค1) ๋ณธ๋ฌธ

CS/๋ฐฑ์ค€

[๋ฐฑ์ค€ c++] 16139 ์ธ๊ฐ„-์ปดํ“จํ„ฐ ์ƒํ˜ธ์ž‘์šฉ (์‹ค1)

๊ฐ•์˜์„œ 2023. 2. 22. 01:56

๐Ÿ“Œ ๋ฌธ์ œ

๋‚ด์šฉ์„ ์ง๊ด€์ ์ด๊ฒŒ ์ •๋ฆฌํ•˜์ž๋ฉด,

๋ฌธ์ž์—ด ๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค q ๋ฅผ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉด

๋ฌธ์ž์—ด S ๋‚ด l๋ฒˆ์งธ ~ r๋ฒˆ์งธ ๋ฌธ์ž ๋‚ด์— ๋ฌธ์ž a๊ฐ€  ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ์ผ€์ด์Šค ๋ณ„๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์กฐ๊ฑด์€ ๋ฌธ์ž์—ด์€ 20๋งŒ์ž ์ดํ•˜, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜๋Š” 20๋งŒ๊ฐœ์ด๋‹ค.

 

์ด๊ฒŒ ๋ฌธ์ œ๋ผ๊ณ ? ๋„ˆ๋ฌด ์‰ฝ์ž–์•„ ๊ทธ๋ƒฅ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆœ ์žˆ์ง€๋งŒ, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜์™€ ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ณด์ž. ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋งˆ๋‹ค ๋ฌธ์ž์—ด์„ ํƒ์ƒ‰ํ•˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ ๋น„ํšจ์œจ์ ์ด๋‹ค.

 

์ด ๋ฌธ์ œ๋Š”, ๊ฒฐ๋ก ์„ ๋จผ์ € ๋งํ•˜์ž๋ฉด ๋ˆ„์ ํ•ฉ ๋ฌธ์ œ์ด๋‹ค.

๋ˆ„์ ํ•ฉ์€ ๋นˆ๋„์ˆ˜๋‚˜ ๊ตฌ๊ฐ„ ๋ณ„ ์ˆซ์ž์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•  ๋•Œ DP๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, n๋ถ€ํ„ฐ m๊นŒ์ง€ ์ˆœ์„œ์— ์žˆ๋Š” ์ˆซ์ž๋ฅผ ๋‹ค ๋”ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์„ ๊ฒฝ์šฐ ์ด ์ „์— 0๋ฒˆ์งธ ์ˆซ์ž๋ถ€ํ„ฐ 5๋ฒˆ์งธ ์ˆซ์ž๋ฅผ ๋”ํ–ˆ๋˜ ์ „์ (?)์ด ์žˆ๋‹ค๋ฉด ์ดํ›„ 0๋ฒˆ์งธ ์ˆซ์ž๋ถ€ํ„ฐ 9๋ฒˆ์งธ ์ˆซ์ž๋ฅผ ๋”ํ•  ๋•Œ 0~5๊นŒ์ง€์˜ ํ•ฉ์„ ๋˜ ๊ตฌํ•  ํ•„์š”๊ฐ€ ์—†์ด ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์ž๋ฃŒ๊ตฌ์กฐ ํ•˜๋‚˜๋ฅผ ์„ ์–ธํ•ด ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ธ DP๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

 

๋ˆ„์ ํ•ฉ์€ DP๋ณด๋‹ค ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ๋‹ค! 

๋จผ์ € ์ด ๋ฌธ์ œ์—์„œ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›์•˜์„ ๋•Œ, ๋ฌธ์ž์—ด์„ ํ•œ ๋ฒˆ ์ˆœํ™˜์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋•Œ, 0๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ์ฒดํฌํ•  ๋•Œ ๋ฌธ์ž์˜ ์•ŒํŒŒ๋ฒณ ๋Œ€๋กœ DP์— ์ €์žฅํ•œ๋‹ค.

 

DP๋Š” 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜๋ฉฐ ํ–‰์€ 26, ์—ด์€ ๋ฌธ์ž์—ด S ๊ธธ์ด ๋งŒํผ ์„ ์–ธํ•˜์ž.

0๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด 'c' ๋ผ๋ฉด DP์˜ 2๋ฒˆ์งธ ์ธ๋ฑ์Šค ( 0๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ 'a' ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž) ์˜ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค์— 1์ด๋ผ๊ณ  ์ง€์ •ํ•˜์ž.

์ด๋Š” ์ฆ‰, DP[2][0] = 1 ์ด ๋œ๋‹ค.

 

์ดํ›„ 1๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ๋˜ 'c'๋ผ๋ฉด DP์˜ 2๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ 1๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•  ๋•Œ

DP[2][1] = DP[2][0] + 1

๋ฅผ ํ•œ๋‹ค. ์™œ? 

 

์ด์ „ 0๋ฒˆ์งธ ๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์—์„œ 'c'๊ฐ€ ๋‚˜ํƒ€๋‚œ ๊ฐฏ์ˆ˜์ธ DP[2][0] ์— 1๋ฒˆ์งธ ๋ฌธ์ž 'c' ๊ฐœ์ˆ˜์ธ 1์„ ๋”ํ•จ์œผ๋กœ์จ

DP[2][1] ์˜ ๊ฐ’์˜ ์˜๋ฏธ๋Š” 1๋ฒˆ์งธ ๋ฌธ์ž๊นŒ์ง€ 'c'์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ, ๋ฌธ์ž๋ฅผ ํ•œ๋ฒˆ ์ˆœํ™˜ํ•˜๊ฒŒ ๋จ์œผ๋กœ์จ ์•ž์„œ ์žˆ์—ˆ๋˜ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๊นŒ์ง€ ๊ณ„์‚ฐ์„ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N*M) -> O(N) ์œผ๋กœ ๋ณ€ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค (์ด๋•Œ N์€ ๋ฌธ์ž์—ด S์˜ ๊ธธ์ด, M์€ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์ˆ˜๋‹ค.)

 

ํšจ์œจ์„ฑ์ด ๊ทน๋„๋กœ ๋†’์•„์ง„๋‹ค!

 

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ๋ฌธ์ œ๋Š” ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š”, 

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๋ˆ„์ ํ•ฉ์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜์ง€ ๋ชปํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ์˜ ๋ฏธ๊ถ์— ๋น ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ค์šด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

 

๐Ÿ’ป ์ •๋‹ต ์ฝ”๋“œ

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

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	string S; cin >> S;
	vector<int> dp[26];

	for (int i = 0; i < S.size(); ++i) {
		for (int j = 0; j < 26; ++j) {
			if (i == 0) {
				int num = S[i] - 'a';
				if (num == j) {
					dp[j].push_back(1);
				}
				else {
					dp[j].push_back(0);
				}
			}
			else {
				int num = S[i] - 'a';
				if (num == j) {
					dp[j].push_back(dp[j][i - 1] + 1);
				}
				else {
					dp[j].push_back(dp[j][i - 1]);
				}
			}
		}
	}
	int q, l, r;
	char alpha;
	cin >> q;
	for (int i = 0; i < q; ++i) {
		cin >> alpha >> l >> r;
		int idx = alpha - 'a';
		if (l == 0) {
			cout << dp[idx][r] << "\n";
		}
		else {
			cout << dp[idx][r] - dp[idx][l - 1] << "\n";
		}
	}
	

	return 0;
}