๐Ÿ•๏ธ ICPC Sinchon/Two Pointer

[BOJ][C++] ๋ฐฑ์ค€ 1593๋ฒˆ: ๋ฌธ์ž ํ•ด๋…

์„ ๋‹ฌ 2024. 8. 30. 20:03
๋ฐ˜์‘ํ˜•

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;
}

 

 

๋ฐ˜์‘ํ˜•