본문 바로가기
개발 노트/백준, 프로그래머스 풀이

[백준 1316/c++] 그룹 단어 체커 - 문자열

by tokkiC 2022. 6. 24.

연속되는 문자가 아니라면 이전에 나온적이 있던 문자인지 확인한다

연속되지 않는 문자가 이전에 나온적 있는 문자라면, 그 단어는 그룹단어가 아니다

이를 확인하기 위해서 문자들이 나올때마다 그 문자에 해당하는 배열에 0으로 초기화 후 하나씩 카운트를 하여

"그 배열의 매칭되는 문자의 값이 0이 아니며, 앞의 문자와 같으면 확인 안하므로 다를때만 확인해야 하므로 앞과 다른지 여부 확인, 앞에 비교할 문자가 있어야 하므로 2번째 문자부터 확인해야 해야 되는" 조건에 부합한다면  그 문자는 나온적이 있는 문자이므로, 그룹단어가 아니라고 체크

그룹단어가 아니라고 체크가 안된 단어들의 수를 세어 답을 구한다

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;


int main(){
	
	int n;
	int bcnt=0;
	cin >> n;
	
	
	for(int i=0; i<n; i++){
		int fai=0;
		string s;
		int ch[28]={0};		// 문자가 이전에 나왔는지 확인하기위해. 한번 나오면 0에서 1로 바꿔주어 확인하도록 함  
		cin >> s;
		
		for(int j=0; j<s.length(); j++){
			ch[s[j]-'a']++;		// 문자를 ch배열에 맞도록 'a'를 빼고 1을 더해 있었다고 체크  
			if(ch[s[j]-'a']>1 && j>1 && (s[j]!=s[j-1])){	// ch 해당 인덱스가 1이면 s[j]는 앞에 나온 문자이다 
				fai++;		// 그룹단어가 아니라고 체크용 	// 앞의 문자와 비교해야 하므로, s의 두번째 문자부터 그룹단어 체크 								
				break;										// 현재 문자가 앞의 문자와 같지 않을때 그룹문자가 맞는지 체크한다  
			}		
		}
		if(fai==0)			// 그룹단어 아니라고 체크 안됐다면 
			bcnt++;			// 그룹단어 수 카운트++ 
	}
	
	cout << bcnt << "\n";
	
	return 0;
}

댓글