BOJ(백준)

[C언어] 백준 1316 - 그룹단어 체커

ruming 2021. 2. 14. 21:04

문제

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

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

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

출력

첫째 줄에 그룹 단어의 개수를 출력한다.


연속되지 않고 한번 더 나온 알파벳을 어떻게 체크할 지 고민을 많이 했는데, 처음에 시도한 방법이 너무 복잡해서 함수를 만들어서 실행해봤다. N으로 받은 단어를 첫번째 글자부터 나머지 글자와 계속 비교하면서 같은 글자가 나올때마다 연속되었는지 확인해서 체크하는 방식을 썼다.

#include <stdio.h>
#include <string.h>
int check(char *N);
int main(void){
	int n, i, ck = 0;
	scanf("%d", &n);
	for(i=0; i<n; i++){
		char N[101] = {0};
		scanf("%s", &N);
		if(check(N)==1)	ck++;
	}
	printf("%d", n-ck);
	return 0;
}
int check(char *N){
	int i, j;
	for(i=0; i<strlen(N); i++){
		for(j=i+1; j<strlen(N); j++){
			if(N[i] == N[j]){
				if(N[j] != N[j-1]){
					return 1;	
				}
			}
		}
	}
	return 0;
}

반복문으로 배열을 여러 개 저장하지 않고 그룹단어인지 체크만 할 수 있도록 확인하는 변수만 사용했다. N을 입력받고 check함수에 넣어 그룹단어이면 0, 그룹단어가 아니면 1을 반환해 ck에는 그룹단어가 아닌 단어의 개수를 저장한다. 그리고 n-ck를 출력한다. 뭐가 잘못된 건지는 모르겠지만 그룹단어일 때 1을 반환하니까 틀려서 숫자가 문제있나라고 생각해 바꿔봤더니 맞았다. check함수에서는 N의 길이만큼 반복해 N의 첫글자와 나머지 글자가 같은지 비교하고, N의 두번째 글자와 나머지가 같은지 비교하고 그런 식으로 서로 비교하는 걸 반복한다. 같은 알파벳이면서 연속되지 않았으면 1을 반환한다.

 

 

 

 

더보기
더보기
#include <stdio.h>
#include <string.h>
int main(void){
	int i, j, n, k, ck=0, flag=0;
	int ch[26] = {0};
	char al[27] = {0};
	for(i=97; i<=122; i++)	al[i-97]=(char)i;
	scanf("%d", &n);
	char N[101] = {0};
	for(i=0; i<n; i++){
		scanf("%s", &N);
		for(j=0; j<strlen(N); j++){
			for(k=0; k<26; k++){
				if(N[j] == al[k]){
					ch[k]++;	//같은 알파벳 체크 
					if(ch[k] >= 2){ 	//같은 알파벳이 있으면 연속된건지 체크 
						if(N[j] != N[j-1]){
							ck++;;	//연속되지 않았으면 체크 	
						}	
					}
				}
				
			}
		}
		if(ck>0){
			flag++;	//그룹단어가 아닌 개수 체크 
		}
	}
	printf("%d", n-flag);	//실패
	return 0;
}

처음에 시도했다가 틀린 코드. 코드가 복잡하긴 하지만 나중에 다시 풀어봐야겠다.