티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 1316번 그룹 단어 체커

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

* 사용언어 : C언어, C++

 

1. 문제

단어 내 모든 문자가 연속해서만 나타나는 경우 그룹 단어라고 함

주어진 N 개의 단어 중 그룹 단어의 개수를 출력

(단어는 모두 알파벳 소문자로만 구성, 최대 길이 100)

실제 문제에는 총 6개의 입출력 예시가 있습니다.

 

2. 풀이

ASCII 값, 반복문 그리고 배열 index 에 대한 이해가 필요한 문제입니다.

 

특정 문자의 반복이 끊겼다는 것을 확인하기 위해서

탐색 중인 문자가 직전 문자와 다를 때, 직전 문자는 끝이라는 기록을 했습니다.

(이후 해당 문자가 나오면 그룹 단어가 아니라는 뜻이 됨)

 

여기서 0번 index 는 1번 index 탐색 시 확인하고 처리되므로

문자열 탐색은 0 이 아닌 1 부터 진행합니다. (k = 1)

 

aabca 단어를 예로 들어 처리 과정을 보여드리고 풀이는 마치겠습니다.

 

0번 a (처리 X)

1번 a (a 기록 안 되어 있음 → pass / 직전 문자와 같으니 기록 X)

2번 b (b 기록 안 되어 있음 → pass / 직전 문자와 다르니 a 기록)

3번 c (c 기록 안 되어 있음 → pass / 직전 문자와 다르니 b 기록)

4번 a (a 기록 되어 있음→ fail 후 반복문 break)

 

3. 코드

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);

	int a[26] = { 0, };
	char s[101];
	int ret = 0;
	int k, pass;

	for (int i = 0; i < n; ++i) {
		scanf("%s", &s);

		for (int j = 0; j < 26; ++j) {
			a[j] = 0;
		}

		k = 1;
		pass = 1;

		while (s[k]) {
			if (a[s[k] - 'a']) {
				pass = 0;
				break;
			}

			if (s[k] != s[k - 1]) {
				++a[s[k - 1] - 'a'];
			}
			++k;
		}

		ret += pass;
	}

	printf("%d\n", ret);
	return 0;
}
728x90
반응형
댓글