하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 9081 단어 맞추기 C++

긤효중 2022. 7. 11. 11:16

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

 

9081번: 단어 맞추기

입력의 첫 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 하나의 단어가 한 줄로 주어진다. 단어는 알파벳 A~Z 대문자로만 이루어지며 항상 공백이 없는 연속된 알

www.acmicpc.net

문제

BEER라는 단어를 이루는 알파벳들로 만들 수 있는 단어들을 사전 순으로 정렬하게 되면

BEER
BERE
BREE
EBER
EBRE
EEBR
EERB
ERBE
EREB
RBEE
REBE
REEB

와 같이 된다. 이러한 순서에서 BEER 다음에 오는 단어는 BERE가 된다. 이와 같이 단어를 주면 그 단어를 이루는 알파벳들로 만들 수 있는 단어들을 사전 순으로 정렬할 때에 주어진 단어 다음에 나오는 단어를 찾는 프로그램을 작성하시오.


입력

입력의 첫 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 하나의 단어가 한 줄로 주어진다. 단어는 알파벳 A~Z 대문자로만 이루어지며 항상 공백이 없는 연속된 알파벳으로 이루어진다. 단어의 길이는 100을 넘지 않는다.


출력

각 테스트 케이스에 대해서 주어진 단어 바로 다음에 나타나는 단어를 한 줄에 하나씩 출력하시오. 만일 주어진 단어가 마지막 단어이라면 그냥 주어진 단어를 출력한다


next_permutation을 사용하여서 해결하였다.

문자열을 입력받고 bool형 변수 2개, 문자열 2개를 선언하고, bool형 변수 2개는 각각 false로 초기화한다.

next_permutation을 사용하는데, bool 변수 2개 모두 false라면 변수 1개를 true로 바꾸고 문자열 1개에 next_permutation을 한 문자열을 담는다 ( 주어진 단어가 마지막 단어일 경우)

 

이제 2번째 next-permutation을 또 다른 문자열 변수에 담고, bool형 변수 나머지 하나도 true로 바꿔준다.

 

그 후 bool형 변수가 모두 true라면 next_permutation을 중지한다.

만약 bool변수 하나만 true라면 처음 입력받은 그 문자열 자체를 출력하고,

bool형 변수 모두 true라면 두 번째 문자열 변수를 출력한다.


#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
int main(void){
    int t;
    cin >> t;
    while(t--){
        string str;
        cin >> str;
 
        bool first = false; 
        bool second = false;
 
        string First = "";
        string Second = "";
 
        do{
            if(first == false){ //처음 단어
                First = str;
                first = true;
            }
            else if(first == true && second == false){ //두번쨰 단어
                Second = str;
                second = true;
            }
            else if(first == true && second == true){ //그 외에는 탈출
                break;
            }
        }while(next_permutation(str.begin(),str.end()));
 
        if(first == true && second == false){ // 이미 마지막 단어라면 
            cout << First << '\n';
        }
        else if(first == true && second == true){ //사전순으로 바로 다음에 오는 단어
            cout << Second << '\n';
        }
 
 
}
}

 

 

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
int main(void){
    int t;
    cin >> t;
    while(t--){
        string str;
        cin >> str;
 
        bool first = false; 
        bool second = false;
 
        string First = "";
        string Second = "";
 
        do{
            if(first == false){ //처음 단어
                First = str;
                first = true;
            }
            else if(first == true && second == false){ //두번쨰 단어
                Second = str;
                second = true;
            }
            else if(first == true && second == true){ //그 외에는 탈출
                break;
            }
        }while(next_permutation(str.begin(),str.end()));
 
        if(first == true && second == false){ // 이미 마지막 단어라면 
            cout << First << '\n';
        }
        else if(first == true && second == true){ //사전순으로 바로 다음에 오는 단어
            cout << Second << '\n';
        }
 
 
}
}

'알고리즘' 카테고리의 다른 글

백준 비슷한 단어 2179 C++  (0) 2022.07.13
백준 11536 줄 세우기 C++  (0) 2022.07.11
백준 11497 통나무 건너뛰기 C++  (0) 2022.07.11
백준 2491 수열 C++  (0) 2022.07.09
백준 10971 외판원 순회 2 C++  (0) 2022.07.06