본문 바로가기
Develop/백준 (Cpp)

[백준] 6443번 : 애너그램 (C++)

by Tarra 2023. 9. 23.

6443번 : 애너그램


문제)

씬디는 애너그램(anagram) 프로그램을 만들어 줄 수 있는 남자를 좋아한다. 참고로 씬디는 매우 예쁘다.

애너그램 프로그램이란, 입력받은 영단어의 철자들로 만들 수 있는 모든 단어를 출력하는 것이다. 가령 "abc" 를 입력받았다면, "abc", "acb", "bac", "bca", "cab", "cba" 를 출력해야 한다.

입력받은 단어내에 몇몇 철자가 중복될 수 있다. 이 경우 같은 단어가 여러 번 만들어 질 수 있는데, 한 번만 출력해야 한다. 또한 출력할 때에 알파벳 순서로 출력해야 한다.

 

 

 

입력 :

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

 

 

 

출력 :

각각의 영단어마다 모든 가능한 애너그램을 출력한다. 각각의 영단어에 대한 애너그램을 출력할 때, 알파벳 순서로 중복되지 않게 출력한다.

 

 

 

 

 

 

풀이)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// 6443. 애너그램
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int t;
 
int n;
string s;
char arr[21];
bool visited[21];
 
void recur(int cur)
{
    if (cur == n)
    {
        for (int i = 0; i < n; i++)
        {
            cout << arr[i];
        }
        cout << '\n';
 
        return;
    }
 
 
    char t = '#';
    for (int i = 0; i < n; i++)
    {
        if (visited[i]) continue;
        if (t != s[i])
        {
            t = s[i];
            arr[cur] = s[i];
            visited[i] = 1;
            recur(cur + 1);
            visited[i] = 0;
        }
    }
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
 
    cin >> t;
 
    while (t--)
    {
        cin >> s;
 
        n = s.length();
        fill(&visited[0], &visited[21], 0);
        sort(s.begin(), s.end());
 
        recur(0);
    }
 
    return 0;
}
cs

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

 

6443번: 애너그램

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

www.acmicpc.net