알고리즘 문제/C++

[백준] 1316번 : 그룹 단어 체커 - C++

lingk 2020. 6. 26. 15:57

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

 

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

int isGroup(string word) {
	vector<char> isExt;
	vector<char>::iterator iter;
	int ext = 0;
	isExt.push_back(word[0]);
	for (int i = 1; i < word.size(); i++) {
		if (word[i] != word[i - 1]) {
			if (find(isExt.begin(), isExt.end(), word[i]) != isExt.end()) {
				ext = 1;
			}
			else {
				isExt.push_back(word[i]);
			}
		}
	}
	return ext;
}
int main(void){
	int num;
	cin >> num;
	int count = 0;
	for (int i = 0; i < num; i++) {
		string words;
		int ext = 0;
		cin >> words;
		if (isGroup(words) == 0)
			count++;
	}
	cout << count;
}

main함수에서 출력되는 값은 그룹단어의 개수이다. 입력받은 숫자만큼 반복문을 돌려 단어를 입력받고, 해당 단어가 그룹단어인지 isGroup함수를 통해서 체크한다. 

 

 

isGroup함수의 인자는 입력받은 단어이고, return 값은 ext이다. ext가 0으로 반환 될 경우 해당 단어는 그룹단어이다.

우선 해당 단어의 첫번째 문자를 벡터 isExt에 push해준다. 이후 단어의 한글자씩 비교하며 해당 문자가 이전 인덱스의 문자와 다를 경우 벡터 isExt에 넣을지를 결정한다. 이전 인덱스의 문자와 다른데, 이미 벡터 isExt에 존재하는 경우는 그룹단어가 될 수 없으므로 ext값을 1로 바꿔준다.

반복문을 빠져 나왔을때 ext값이 여전히 0이라면 해당 단어는 그룹단어이다.

 

 

반응형