• toc {:toc}

๋ฌธ์ œ ํ™•์ธํ•˜๊ธฐ

ํ’€์ด

๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ์•ˆ ํ’€์–ด๋ด์„œ ๊ตฌ์กฐ๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ถ”ํ›„์— ๋‹ค์‹œ ํ’€์–ด๋ด์•ผ๊ฒ ๋‹ค.

  • ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋Š” ์›๋ž˜ ๋ฌธ์žฅ๊ณผ ๋ฆฌํŠธ ๋ฌธ์žฅ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ „๋ถ€ ์—ฐ๊ฒฐ์‹œ์ผœ๋ณด๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ณผ์ •์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์—ฐ๊ฒฐ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋˜๋Œ์•„์˜ค๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์˜ฌ๋ฐ”๋ฅธ ์—ฐ๊ฒฐ์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ๋ฆฌํŠธ ์—ฐ๊ฒฐ์„ ํ•œ ์•ŒํŒŒ๋ฒณ์ด ๋‹ค์‹œ ๋‚˜ํƒ€๋‚ฌ์„ ๋•Œ ์—ฐ๊ฒฐ๋œ ๋ฆฌํŠธ ํ‘œํ˜„๊ณผ ์•ŒํŒŒ๋ฒณ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฆฌํŠธ ํ‘œํ˜„์ด ๋™์ผํ•œ์ง€ ์—ฌ๋ถ€์ด๋‹ค. ex)aa โ†’ @@ ์ธ ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ ํ‘œํ˜„, aa โ†’ @! ์ธ ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์—ฐ๊ฒฐ
  • o_idx์™€ l_idx๊ฐ€ ๋™์‹œ์— ๋์— ๋„๋‹ฌํ•œ๋‹ค๋ฉด ๋ชจ๋‘ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ true ๋ฐ˜ํ™˜
  • ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๋์— ๋„๋‹ฌํ•˜๋ฉด ์—ฐ๊ฒฐ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฏ€๋กœ false ๋ฐ˜ํ™˜
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
 
int k;
string original, leet_word;
string leet_mapping[30];
 
bool isPossible(int o_idx, int l_idx){
    if(o_idx == original.length() && l_idx == leet_word.length()){
        return true;
    }
    if(o_idx == original.length() || l_idx == leet_word.length()){
        return false;
    }
    int alpha_idx = original[o_idx]-'a';
    if(leet_mapping[alpha_idx] == ""){  // ๋ฆฌํŠธ ํ‘œํ˜„์ด ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
        for(int i = 1; i <= k && l_idx + i <= leet_word.length(); i++){
            leet_mapping[alpha_idx] = leet_word.substr(l_idx, i);
            if(isPossible(o_idx+1, l_idx+i)){
                return true;
            }
        }
		leet_mapping[alpha_idx] = "";  // ๋˜๋Œ์•„ ์˜ค๋Š” ๊ณผ์ •์—์„œ ์ดˆ๊ธฐํ™”
    }
    else{                              // ๋ฆฌํŠธ ํ‘œํ˜„์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ
        string mapped_leet = leet_mapping[alpha_idx];
        if(mapped_leet == leet_word.substr(l_idx, mapped_leet.length())){
            if(isPossible(o_idx+1, l_idx+mapped_leet.length())){
                return true;
            }
        }
    }
    return false;
}
 
int main(){
    ios::sync_with_stdio(0); cin.tie(0);
 
    int T;
    cin >> T;
    while(T--){
        fill(leet_mapping, leet_mapping+30, "");
        cin >> k >> original >> leet_word;
        bool res = isPossible(0, 0);
        if(res) cout << 1 << endl; 
        else cout << 0 << endl;
    }
 
    return 0;
}