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

anfruf·2022년 6월 28일

백준 C언어

목록 보기
54/62
  1. C언어 : 문자열(10)

28.JUN.2022

문제 : 문자열

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 
예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 
나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다. 
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

문제 풀이

#include <stdio.h>
#include <string.h>

int main()
{
	int input, len, check = 0, count = 0;
	char str[100];
	scanf("%d", &input); // 문자열의 개수
	
	for (int i = 0; i < input; i++) { // 개수만큼 돌며 문자열 입력받기
		scanf("%s", str);
		len = strlen(str);

		check = 0; // 그룹 단어인지 아닌지 체크할 check 변수
		for (int j = 0; j <len; j++) { // 단어를 도는 j
			for (int k = 0; k < j; k++) { // j의 전 문자들을 도는 k
            	// 단어의 문자가 같은데, -1 즉 전 단어와 같지 않을 때(반복되지 않으면)
				if (str[j] == str[k] && str[j - 1] != str[k]) { 
					check = 1; // 그룹 단어가 아니다
					break;
				}
			}
		}
		if (!check) // 1이 그룹 단어가 아니므로 0일 때
			count++; // 그룹 단어 count
	}
	printf("%d", count);
	return 0;
}

예를 들면 단어 입력을 new를 입력한다고 치면, j=1이고, k=0이라고 했을 때 str[j]==e, str[k]==n으로 둘은 같지 않고, 이런 식으로 단어를 돌아도 같은 알파벳이 없으니까 check가 되지 않는다. 따라서 for문이 끝나고 check==0이므로 if에 들어와 그룹 단어라고 count 된다.

단어 입력을 aca라고 했을 때는 for의 if문에서 a와 a를 비교할 때 둘은 같지만
str[j-1] != str[k], 즉 a와 그 전인 k가 같지 않으므로 check가 된다. 따라서 for문을 나와 만난 if 문은 실행되지 않는다.

생각보다 헷갈리는 문제라 디버깅으로 실행하면서 흐름을 봐야 했다. 왜 헷갈렸냐.
바보같이 if (!check)가 아니라 if(!count)로 써놓고 왜 안 돼!!! 하면서 눙물이나 흘리고 있었기 떄문이지🤤 그래 사람은...좀 모질라도..그래....
아무튼 디버깅으로 흐름 보다가 거기서 깜짝 놀라 고쳤더니 생각처럼 돌아가서 안심했다.

이럴 때마다 디버깅 하는 습관이 좋긴 한데...지금은 코드가 짧으니까 전체 흐름보다가 고칠 수 있지 긴 코드는...내가 어느 부분에서 에러가 나는 지 감도 못 잡으면 부분 디버깅도 할 수 없고 어떻게 된단 말인가🤨 뭘 어떻게 해 잠깐 멍 때리고 찾으면 될 걸. 아이 씽나!!

0개의 댓글