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

[백준] 1342번 : 행운의 문자열 (C++)

by Tarra 2023. 8. 29.

1342번 : 행운의 문자열


 

문제)

민식이와 준영이는 자기 방에서 문자열을 공부하고 있다. 민식이가 말하길 인접해 있는 모든 문자가 같지 않은 문자열을 행운의 문자열이라고 한다고 한다. 준영이는 문자열 S를 분석하기 시작했다. 준영이는 문자열 S에 나오는 문자를 재배치하면 서로 다른 행운의 문자열이 몇 개 나오는지 궁금해졌다. 만약 원래 문자열 S도 행운의 문자열이라면 그것도 개수에 포함한다.

 

 

 

입력 :

첫째 줄에 문자열 S가 주어진다. S의 길이는 최대 10이고, 알파벳 소문자로만 이루어져 있다.

 

 

 

출력 :

첫째 줄에 위치를 재배치해서 얻은 서로 다른 행운의 문자열의 개수를 출력한다.

 

 

 

 

 

풀이)

 

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
#include <iostream>
#include <string>
 
using namespace std;
 
string word;
// 임시로 넓게 잡음
int alpha[27];
int cnt;
 
// 처음엔 이전 알파벳을 기반으로 하는 메모이제이션을
// 구상했으나, 여러번 틀리고 내린 결과가.
// 이미 백트래킹으로 인해 이전 알파벳을 걸러냈으니
// 메모이제이션을 굳이 구현할 필요가 없다는 것이었다.
 
void recur(int cur, char prev)
{
    if (cur == word.length())
    {
        cnt++;
        return;
    }
 
    for (int i = 0; i < 26; i++)
    {
        if (alpha[i] > 0 && i != prev)
        {
            alpha[i]--;
            recur(cur + 1, i);
            alpha[i]++;
        }
    }
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
 
    cin >> word;
    for (int i = 0; i < word.length(); i++)
    {
        alpha[word[i] - 'a']++;
    }
 
    recur(0' ');
 
    cout << cnt;
 
    return 0;
}
 
cs

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

 

1342번: 행운의 문자열

민식이와 준영이는 자기 방에서 문자열을 공부하고 있다. 민식이가 말하길 인접해 있는 모든 문자가 같지 않은 문자열을 행운의 문자열이라고 한다고 한다. 준영이는 문자열 S를 분석하기 시작

www.acmicpc.net