백준의 다음 다양한 단어(16923) 문제이다.
[ 문제 바로가기 ]
[ 문제풀이 ]
1) 주어진 입력 다음에 오는 '다양한 단어'를 출력하는 문제이다. 먼저 본인은 크게 2가지로 나눠보았다.
바로 입력되는 문자열의 길이가 26이냐 아니냐 로 나눴다.
26이 의미하는 것은 알파벳의 갯수이다. 알파벳은 총 26개이고, 문자열의 길이가 26이라는 것은
입력된 문자열에서 모든 알파벳을 사용했다는 것이고, 사전 순으로 그 다음에 출력할 문자열이 있으면 그 문자열을
출력하고, 그게 아니라면 -1을 출력하도록 구현하였다.
또 하나는 26이 아니라는 것이다. 즉, 26이 아니라는 것은 그 다음에 또 다른 문자가 올 수 있다는 것이다.
그런데 생각을 해보자. bcd 라는 문자열이 입력됬을 때 그 다음 입력되는 다양한 단어는 무엇일까?
바로 bcda 라는 것을 별 생각 없이 알 수 있다. 즉, 문자열의 길이가 26이 아닐 때는, 현재 문자열에서 나오지 않은
알파벳 중에 제일 앞에 있는 놈을 뒤에 붙여주기만 하면 다음 다양한 단어가 될 수 있다.
따라서, 본인은 Alphabet[26]이라는 int형 배열을 만들어서, 초기값을 -1로 설정해 주었고, 각 문자들이 저장되는
Index번호를 저장해 주었다. 즉, bcd가 입력됬을 때, Alphabet[0](a를 의미) = -1 일 것이고, Alphabet[1](b를 의미)
= 0 이 저장되어 있을 것이다.
즉, 길이가 26이 아닐 때에는 저 Alphabet[] 배열을 통해서 가장 처음으로 나오는 -1이 나오는 문자를 입력된
문자열에 뒤에 추가하는 식으로 구현해 보았다.
그렇다면 이제는 길이가 26일때를 생각해보자. 길이가 26이라는 말은, 이미 입력된 문자열에서 26개의 알파벳을
모두 사용했다는 말이고, 기존의 방법처럼 그 뒤에 어떤 알파벳을 추가한다는 것은 불가능하다.
본인은 이 부분을 고민을 하다가 next_permutation() 함수를 이용해서 구현해보았다.
next_permutation(a, a + N)은, 배열 a가 이루고 있는 상태에서 그 다음에 올 수 있는 새로운 순열이 존재한다면
true를 반환, 그게 아니면 false를 반환하는 함수이다.
즉, next_permutation() == true라는 것은, 그 다음에 출력할 수 있는 문자열이 존재한다는 뜻이기 때문에 그 문자열을
출력시키도록 구현하였고, 그게 아니라면 -1을 출력하도록 구현해 보았다.
[ 소스코드 ]
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 65 66 67 | #include<iostream> #include<string> #include<cstring> #include<algorithm> #define endl "\n" using namespace std; int Alphabet[26], Len; char Inp[26]; string Answer; void Input() { memset(Alphabet, -1, sizeof(Alphabet)); string Temp; cin >> Temp; Len = Temp.length(); for (int i = 0; i < Len; i++) { Inp[i] = Temp[i]; Alphabet[Inp[i] - 'a'] = i; } Answer = Temp; } void Solution() { if (Len == 26) { if (next_permutation(Inp, Inp + 27) == true) { cout << Inp << endl; } else cout << -1 << endl; } else { for (int i = 0; i < 26; i++) { if (Alphabet[i] == -1) { char C = (i + 'a'); Answer = Answer + C; break; } } cout << Answer << endl; } } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 16929 ] Two Dots (C++) (0) | 2019.07.07 |
---|---|
[ 백준 16926 ] 배열 돌리기1 (C++) (0) | 2019.07.07 |
[ 백준 16922 ] 로마 숫자 만들기 (C++) (0) | 2019.07.07 |
[ 백준 16917 ] 양념 반 후라이드 반 (C++) (0) | 2019.07.07 |
[ 백준 2933 ] 미네랄 (C++) (4) | 2019.07.05 |