아직은 정체성이 없는 블로그

[SWEA][D3][c++] 9480. 민정이와 광직이의 알파벳 공부 본문

알고리즘 역량테스트 문제/SWEA

[SWEA][D3][c++] 9480. 민정이와 광직이의 알파벳 공부

coooding 2020. 8. 11. 21:59

문제

9480. 민정이와 광직이의 알파벳 공부

 

문제 링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXAdrmW61ssDFAXq

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

풀이 과정

 

모든 단어의 조합에서 알파벳 a~z 까지를 다 가지고 있는지를 확인하는 방식으로 문제를 풀었습니다.

 

1.입력받은 단어를 vector에 넣는다.

2.DFS를 사용하여 alphabet배열에 입력받은 단어의 알파벳을 가지고 있는 위치의 수를 1더한다.

3.alphabet 배열을 체크하여 현재 a~z 까지를 다 가지고 있는지를 확인한다.

4.index에 1을 더하고 다시 DFS를 한다

5.2에서 더했던 알파벳들을 다시 다 빼준다.

6.모든 DFS가 끝난 후 결과를 출력한다.

 

코드

#include<iostream>
#include<cstring>
#include<string>
#include<vector>
using namespace std;

int alphabet[26];
vector<string> words;
int n;
int result;

//알파벳 넣기
void alphabetAdd(string s){
    for(int i=0; i<s.size();i++){
    	alphabet[s[i]-'a']++;
    }
}

//알파벳 빼기
void alphabetSub(string s){
    for(int i=0; i<s.size();i++){
    	alphabet[s[i]-'a']--;
    }
}

//알파벳 다있는지 확인
bool alphabetCheck(){
    for(int i=0; i<26;i++){
    	if(alphabet[i]<1)
            return false;
    }
    return true;
}

//모든 경우의 수 
void dfs(int index){
    if(index==words.size())
        return;
    
	for(int i=index; i<words.size(); i++){
        alphabetAdd(words[i]);
        if(alphabetCheck())
            result++;
        dfs(i+1);
        alphabetSub(words[i]);
    }
}

int main(int argc, char** argv)
{
	int test_case;
	int T;
	cin>>T;
    
 
	
    for(test_case = 1; test_case <= T; ++test_case)
	{
        result=0;
        memset(alphabet,0,sizeof(alphabet));
        words.clear();
        cin>>n;
        
        for(int i=0; i<n; i++){
        	string s;
            cin>>s;
            words.push_back(s);
        }
        dfs(0);
        
        cout<<"#"<<test_case<<" "<<result<<"\n";
        
	}
	return 0;
}

 

 

Comments