https://www.acmicpc.net/problem/1593
๋ฌธ์
๋ง์ผ ๋ฌธ์๋ฅผ ํด๋ ํ๋ ์ผ์ ์์ ์ธ๋ก ์ด๋ ค์ด ์ผ์ด๋ค. ํ์ฌ์๋ ๋ป์ด ์์ ํ ๋ฐํ์ง ๋ง์ผ ๋ฌธ์๋ ๊ฑฐ์ ์๋ ์ค์ ์ด๋ฉฐ, ๊ทธ๋๋ง ํด๋ ์ ์ง์ฒ์ด ์์๋ ์ง๋ 30์ฌ ๋ ๋ ๋์ง ์์๋ค.
๋ง์ผ ๋ฌธ์๋ ์๋ฆฌ๋ฅผ ๋ํ๋ด๋ ์ฌ๋ฌ ์ข ๋ฅ์ ๊ทธ๋ฆผ๊ธ์๋ก ๊ตฌ์ฑ๋๋๋ฐ, ์ด ๊ธ์๋ค์ด ์ฌ๋ฌ ์์น์์ ๊ฒฐํฉํจ์ผ๋ก์จ ๋จ์ด๋ฅผ ํ์ฑํ๋ค.
๋ง์ผ ๋ฌธ์ ํด๋ ์ ์ด๋ ต๊ฒ ํ๋ ์์ธ ์ค ํ๋๋ ๋ฐ๋ก ๋จ์ด๋ฅผ ์ฝ๋ ์์์ด๋ค. ๋ง์ผ ๋ฌธ์๋ฅผ ์ฐ๋ ๊ณ ๋์ธ๋ค์ ๋จ์ด๋ฅผ ๊ธฐ๋กํ ๋ ํน์ ํ ๊ท์น ๋์ , ๊ทธ๋ค์ด ๋ณด๊ธฐ์ ์ข๊ฒ ๋ณด์ด๋๋ก ๋จ์ด๋ฅผ ์ด๋ฃจ๋ ๊ธ์๋ค์ ์๋ฌด๋ ๊ฒ๋ ๋ฐฐ์ดํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ณ ๊ณ ํ์๋ค์ด ๋ง์ผ ๊ธฐ๋ก์์ ๋จ์ด๋ฅผ ์ด๋ฃจ๋ ๊ฐ ๊ทธ๋ฆผ๊ธ์๋ค์ ๋ฐ์์ ์์๋ด๋๋ผ๋ ๊ทธ ๋จ์ด๋ฅผ ์ค์ ๋ก ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์ ์ ํํ ์ ์ ์๋ ์ ์ด๋ค.
๊ณ ๊ณ ํ์๋ค์ W๋ผ๋ ํน์ ๋จ์ด๋ฅผ ๋ฐ๊ตด ๊ธฐ๋ก์ผ๋ก๋ถํฐ ์ฐพ๊ณ ์๋ค. ๊ทธ ๋จ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ ๊ธ์๋ค์ ๋ฌด์์ธ์ง ์๊ณ ์์ง๋ง, ์ด๊ฒ์ด ๊ณ ๋ ๊ธฐ๋ก์ ์ด๋ค ํํ๋ก ์จ์ด ์๋์ง๋ ๋ค ์์ง ๋ชปํ๋ค.
W๋ฅผ ์ด๋ฃจ๊ณ ์๋ g๊ฐ์ ๊ทธ๋ฆผ๋ฌธ์์, ์ฐ๊ตฌ ๋์์ธ ๋ฒฝํ์ ๊ธฐ๋ก๋ ๋ง์ผ ๋ฌธ์์ด S๊ฐ ์ฃผ์ด์ก์ ๋, ๋จ์ด W๊ฐ ๋ง์ผ ๋ฌธ์์ด S์ ๋ค์ด์์ ์ ์๋ ๋ชจ๋ ๊ฐ์ง์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ฆ, ๋ฌธ์์ด S์์์ ๋ฌธ์์ด W์ ์์ด ์ค ํ๋๊ฐ ๋ถ๋ถ ๋ฌธ์์ด๋ก ๋ค์ด์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ผ๋ ๋ป์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ณ ๊ณ ํ์๋ค์ด ์ฐพ๊ณ ์ ํ๋ ๋จ์ด W์ ๊ธธ์ด g์ ๋ฐ๊ตด๋ ๋ฒฝํ์์ ์ถ์ถํ ๋ฌธ์์ด S์ ๊ธธ์ด |S|๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. (1≤g≤3000, g≤|S|≤3,000,000) ๋์งธ ์ค์ W, ์ ์งธ ์ค์ S์ ์ค์ ๋ด์ฉ์ด ๋ค์ด์๋ค. ๋ชจ๋ ๋ฌธ์์ด์ ์ํ๋ฒณ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ W์ ์์ด์ด S ์์ ์์ ์ ์๋ ํํ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
์๊ฐ์ ํ์ด ๊น๋ค๋กญ๋ค.
์ผ๋จ ํฌํฌ์ธํฐ๋ฅผ ์์ฉํ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ํ์ฉํด์ผํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฃผ์ด์ง ๊ตฌ๊ฐ์ w์ ์์ด์ด ์กด์ฌํ๋์ง ํ๋จํด์ผํ๋๋ฐ
์ฒ์์ ๋จ์ํ ๋ ๋ฌธ์์ด์ ๋๋ ์ด์ค For๋ฌธ์ ์ด์ฉํ๋๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค. (1%)
๋๋ฒ์งธ๋ก๋ sort๋ฅผ ์ด์ฉํด์ ๊ฐํธํ๊ฒ ๋น๊ตํด๋ดค๋๋ฐ ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค. (2%)
์ธ๋ฒ์จฐ๋ก๋ ์ํ๋ฒณ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๊ตฌ์ฑ ์ํ๋ฒณ์ ๋น๊ตํด๋ดค๋๋ฐ ๋๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค (8%)
๊ทธ์์ค์ ๊พธ์คํ๊ฒ ํผ์ผํฐ์ง๋ ์ฌ๋ผ๊ฐ๋๊ฒ ๋งค์ฐ ์ด๋ฐ๋๋ค
์๋ฌด๋ฆฌ ๋ด๋ ์ธ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ๋ง๋ ๊ฒ ๊ฐ์์
์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ข ๋ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ ์ ์๋๋ก ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ณ
์ด๋ฒ์ ๋๋์ด ๋ง์๋ค!
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
using namespace std;
bool isIncluded(vector<int>&alphabet) {
for(int i : alphabet) {
if(i!=0) {
return false;
}
}
return true;
}
int main() {
ios_base::sync_with_stdio(false);
cout.tie(NULL);
cin.tie(NULL);
int g, n;
string w, s;
cin >> g >> n;
cin >> w >> s;
// w์ ์ํ๋ฒณ ๊ตฌ์ฑ
vector<int>alphabet(60, 0);
for(char c : w) {
alphabet[c-'A']++;
}
// ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
int left=0, right=g;
int ans=0;
for(int i=left; i<right; i++) {
alphabet[s[i]-'A']--;
}
while(right<=n) {
// ํฌํจ์ด๋ฉด ์นด์ดํธ+1
if(isIncluded(alphabet)) {
ans++;
}
// ์๋์ฐ ์ด๋
alphabet[s[left]-'A']++;
left++;
alphabet[s[right]-'A']--;
right++;
}
cout << ans;
return 0;
}
์ํ์ฐฉ์ค
85%์ฏค์์ ํ๋ ธ์ต๋๋ค๊ฐ ๋ฌ๋ค๋ฉด..
์ฌ๋ผ์ด๋ฉ ์๋์ฐ๊ฐ ๋๊น์ง ๊ฐ๋์ง ํ์ธํ์..
๋ฌธ์ ํน์ฑ์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ์ฌ์ฉํ ํฌ ํฌ์ธํฐ์ ์ธ๋ฑ์ค์ ์๋ฏธ๋ฅผ ๋ช ํํ๊ฒ ์ง์ ํ๊ณ ํ์ด์ผํ๋ค
์๋๋ ์ฝ๋ ๋ณ์ฒ ๊ณผ์ ์์นด์ด๋น..
์ฝ๋ ๋ณ์ฒ๊ณผ์
1. ์ด์ค For๋ฌธ์ ๋๋ฆฐ ์ด๊ธฐ ์ฝ๋ : O(n^2) ์ถ์
bool isIncluded(int left, int right) {
included.assign(g, false);
for(int i=left; i<right; i++) {
for(int j=0; j<g; j++) {
if(s[i]==w[j]) {
included[j] = true;
break;
}
}
}
for(bool i : included) {
if(!i) {
return false;
}
}
return true;
}
2. sort๋ฅผ ์ด์ฉํ ๋๋ฒ์งธ ์ฝ๋ : O(nlogn) ์ถ์
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
int main() {
int g, n;
string w, s;
cin >> g >> n;
cin >> w >> s;
sort(w.begin(), w.end());
int left=0, right=g;
int ans = 0;
string new_s = "", tmp;
for(int i=left; i<right; i++) {
new_s += s[i];
}
while(right<n) {
tmp = new_s;
sort(tmp.begin(), tmp.end());
if(tmp==w) {
ans++;
}
left++;
new_s.erase(0,1);
right++;
new_s += s[right-1];
}
cout << ans;
return 0;
}
3. ์ํ๋ฒณ ๋ฐฐ์ด์ ์ด์ฉํ ๊ตฌ์ฑ์์ ๋น๊ต
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
using namespace std;
bool isIncluded(string s, vector<int>alphabet) {
for(char c : s) {
if(alphabet[c-'A']==0) {
return false;
}
alphabet[c-'A']--;
}
for(int i=0; i<alphabet.size(); i++) {
if(alphabet[i]!=0) {
return false;
}
}
return true;
}
int main() {
ios_base::sync_with_stdio(false);
cout.tie(NULL);
cin.tie(NULL);
int g, n;
string w, s;
cin >> g >> n;
cin >> w >> s;
// w์ ์ํ๋ฒณ ๊ตฌ์ฑ
vector<int>alphabet(60, 0);
for(char c : w) {
alphabet[c-'A']++;
}
// ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
int left=0, right=g;
int ans = 0;
string new_s = s.substr(left, right);
while(right<n) {
// ํฌํจ์ฌ๋ถ ํ๋จ
if(isIncluded(new_s, alphabet)) {
ans++;
}
// ์๋์ฐ ์ด๋
left++;
new_s.erase(0,1);
right++;
new_s += s[right-1];
}
cout << ans;
return 0;
}
'๐๏ธ ICPC Sinchon > Two Pointer' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 2473๋ฒ: ์ธ ์ฉ์ก (1) | 2024.09.04 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 15565๋ฒ: ๊ท์ฌ์ด ๋ผ์ด์ธ (0) | 2024.08.29 |
[BOJ][C++] ๋ฐฑ์ค 1806๋ฒ: ๋ถ๋ถํฉ (0) | 2024.08.28 |
[BOJ][C++] ๋ฐฑ์ค 7795๋ฒ: ๋จน์ ๊ฒ์ธ๊ฐ ๋จนํ ๊ฒ์ธ๊ฐ (0) | 2024.08.19 |
[BOJ][C++] ๋ฐฑ์ค 2467๋ฒ: ์ฉ์ก (0) | 2024.08.18 |