1일1알

백준 6443번 애너그램 C++ 본문

알고리즘

백준 6443번 애너그램 C++

영춘권의달인 2022. 12. 17. 12:37

https://www.acmicpc.net/problem/6443

 

6443번: 애너그램

첫째 줄에 단어의 개수 N 이, 둘째 줄부터 N개의 영단어가 들어온다. 영단어는 소문자로 이루어져 있다. 단어의 길이는 20보다 작거나 같고, 애너그램의 수가 100,000개 이하인 단어만 입력으로 주

www.acmicpc.net

 

전체 문자열에 대해 백트래킹을 시도하면 시간초과가 나서 알파벳 개수에 대해 백트래킹으로 하니까 중복, 정렬 문제도 자연스럽게 해결이 되도록 풀렸다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

int n, len;
string str;
vector<int> visited;
string ans;

void BT() {
    if (ans.length() == len) {
        cout << ans << "\n";
        return;
    }
    for (int i = 0; i < 26; i++) {
        if (visited[i] == 0) continue;
        visited[i]--;
        ans += 'a' + i;
        BT();
        visited[i]++;
        ans.pop_back();
    }
}

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

    cin >> n;
    while (n--) {
        cin >> str;
        len = str.length();
        visited = vector<int>(26, 0);
        ans = "";
        for (int i = 0; i < len; i++) {
            visited[str[i] - 'a']++;
        }
        BT();
    }
}