728x90
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ง๐ปํ์ด ๊ณผ์
๋์ ๋ฉ์ฒญํ ์ค์
์ด์ ๋ฌธ์ ์์ ๋์ ํฉ์ ์ ๊ตฌํด๋๊ณ , ์ฌ๊ธฐ์์๋ ์ ์ ์ฉ์ ๋ชปํ๋ ์ถ์ต๋๋ค..
์ฒ์์๋ DP[26][S.length()] ๋ฐฐ์ด์ ์ ์ธํ์ฌ, ๊ฐ ์ํ๋ฒณ๋ง๋ค ๋ฑ์ฅํ ํ์๋ฅผ ๋์ ํ์ฌ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ์์ต๋๋ค.
const int ALPHABET_COUNT = 26;
const int LOWER_A_ASCII = 97;
string S;
vector<vector<int>> DP(ALPHABET_COUNT, vector<int>(S.length()));
for (int i = 0; i < S.length(); i++)
{
// i-1๋ฒ ์ด์ ๋์ ๊ฐ์๋ค ๊ทธ๋๋ก ๊ฐ์ ธ์ค๊ธฐ
for (int j = 0; (i != 0) and (j < ALPHABET_COUNT); j++)
if (DP[j][i-1] != 0)
DP[j][i] = DP[j][i-1];
// S[i]์ ํด๋นํ๋ ์ํ๋ฒณ ๊ฐ์ ์ถ๊ฐ
int index = S[i] - LOWER_A_ASCII;
DP[index][i]++;
}
์ด๋ ๊ฒ ์ ๊ตฌํด๋๊ณ , ์ ์ง๋ฌธ์์ DP[alphabet][r] - DP[alphabet][l - 1]์ ์๊ฐ ๋ชป ํ๋ ์ถ๋ค์...
์๋ฌดํผ, ์ ์์ ์๊ฐ ๋ชปํ๋ ๋ฐ๋์ ์ด์ง ํ์(Binary Search)๋ก ํ์ด ๋ฐฉํฅ์ ๋ฐ๊พธ์์ต๋๋ค..
์ด์ง ํ์ ๋ฐฉ์ ์ ๊ทผ
- ์ฃผ์ด์ง S ๋ฌธ์์ด์์, ๊ฐ๊ฐ์ ์ํ๋ฒณ๋ค์ด ๋ฑ์ฅํ๋ ์ธ๋ฑ์ค ์์น๋ค์ ๋ฐฐ์ด๋ก ๋ด์์ต๋๋ค.
- for ๋ฌธ์ผ๋ก ์์ฐจ ํ์ํ ๊ฑฐ๋ผ, ์๋์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ด ๋์ด ์์ต๋๋ค.
- ๋ฌธ์ ์์ ์ฃผ์ด์ง l, r์ ๋ํ์ฌ, l์๋ lower_bound(), r์๋ upper_bound()๋ฅผ ์ ์ฉํฉ๋๋ค.
- lower_bound()์ upper_bound() ๊ฒฐ๊ณผ ๊ฐ๊ฐ์ vector.begin()์ ๋นผ๋ฉด ์ธ๋ฑ์ค ๋ฒํธ๊ฐ ๋์ต๋๋ค.
- 2๋ฒ์์ ๊ตฌํ ์ธ๋ฑ์ค ๋ฒํธ ์ฐจ์ด๊ฐ ์ ๋ต์ ๋๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
const int ALPHABET_COUNT = 26;
const int LOWER_A_ASCII = 97;
int main()
{
ios::sync_with_stdio(false);
cout.tie(NULL); cin.tie(NULL);
int quesitionCount;
string sequence;
cin >> sequence >> quesitionCount;
// 1. ๊ฐ ์ํ๋ฒณ๋ง๋ค, ๋์ค๋ ์์น๋ค์ ์ ์ฅ
vector<vector<int>> alphabetPositions(ALPHABET_COUNT);
for (int i = 0; i < sequence.length(); i++)
{
int index = sequence[i] - LOWER_A_ASCII;
alphabetPositions[index].emplace_back(i);
}
// 2. ์ด์ง ํ์์ ์ด์ฉํ์ฌ, ์ธ๋ฑ์ค ์ฐจ์ด๋ฅผ ๊ณ์ฐ ํ ์ถ๋ ฅ
for (int i = 0; i < quesitionCount; i++)
{
char find;
int l, r;
cin >> find >> l >> r;
int index = find - LOWER_A_ASCII;
int start = lower_bound(alphabetPositions[index].begin(), alphabetPositions[index].end(), l) - alphabetPositions[index].begin();
int last = upper_bound(alphabetPositions[index].begin(), alphabetPositions[index].end(), r) - alphabetPositions[index].begin();
cout << last - start << "\n";
}
return 0;
}
728x90
๋ฐ์ํ
'๐คAlgorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 11660๋ฒ | ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 5 (C++) (0) | 2023.08.29 |
---|---|
[BOJ] 2559๋ฒ | ์์ด (C++) (0) | 2023.08.27 |
[BOJ] 11659๋ฒ | ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 4 (C++) (0) | 2023.08.27 |
[BOJ] 10844๋ฒ | ์ฌ์ด ๊ณ๋จ ์ (C++) (0) | 2023.08.26 |
[BOJ] 3190๋ฒ | ๋ฑ (C++) (1) | 2023.08.26 |