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

이성훈·2021년 11월 9일
0

문제

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

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

입력

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

출력

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

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

처음 t를 받고, t회 반복한다.
단어를 받을 char배열 word,
사용된 알파벳을 체크할 bool배열 alphabet을 선언하고(false로 초기화필수)
매 t회마다 101회(단어최대 100글자, NULL발견시 반복문종료를위함) 반복하여 내부에 아래 기능을 구현한다.

  • word[i] 가 NULL이면 아래에서 체크할 오류들에 걸리지않았으므로
    그룹단어갯수를 +1 한다.
  • 현재 단어 word[i]를 아스키코드값(asci)으로 변환한다.
  • 아스키코드값을 이용하여 알파벳을 사용됨을 true로 체크한다.
  • 오류체크 : 바로직전의문자(word[i-1] != word[i] 이며, 알파벳이 체크된경우 alphabet[asci] == true
    반복문을 탈출한다.

코드를 작성하며 아래의 2가지 실수를 하였다.

  1. 단어의최대길이는 100자, 그러나 내부반복문에서 word[i] == NULL이어야 그룹단어임으로 체크했으니
    word 배열은 101자로 선언했어야한다.
  2. alphabet배열을 선언할때 초기화를 하지않고 사용하였다.

2번의경우,

bool alphabet[26] = {} // 모두 false로 초기화
bool alphabet[26] = {true,} //첫원소만 true, 나머지는 모두 우리가 아는 초깃값

최종적으로 코드는 아래와 같다.

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

int main(void) {
	int t, cnt = 0;
	scanf("%d", &t);
	while (t--) {
		char word[101];
		bool alphabet[26];
		memset(alphabet, 0, sizeof(alphabet));
		scanf("%s", word); //단어를 읽음

		for (int i = 0; i < 101; i++) {
			if (word[i] == NULL) {
				cnt++; //단어의 마지막까지왔으면 그룹단어
				break;
			}
			int asci = word[i] - 'a'; //현재문자를 아스키코드값으로 변환

			//연속된경우
			if (word[i] != word[i - 1] && alphabet[asci] == true) {
				//연속되지않은경우에 이미 체크된 문자면
				break;
			}
			alphabet[asci] = true;
		}
	}
	printf("%d", cnt);
}
profile
I will be a socially developer

0개의 댓글