[C] 백준 1316번 write-up
백준 1316번 그룹 단어 체커 문제입니다.
보통 문제 설명이 짧으면 어려운 문제가 대다수인데요
설명 5줄 문제 치고는 상당히 재밌었습니다.
늘 그렇듯이 문제를 풀기 전, 문제 해석을 해보도록 할게요.
1. 입력받은 문자열 중, 연속하지 않은 문자가 나온다면 해당 문자열은 그룹단어가 아니다. 라는 핵심 키워드가 있네요.
2. 1번의 연장선으로, 나오는 문자가 이전에 나왔었던 문자라면 해당 문자열이 그룹단어가 아니다 라는 뜻이 되겠네요
그렇다면 어떻게 로직을 짜야할까요?
여러분도 아시겠지만 C언어는 X세대 언어라 MZ감성을 따라오지 못합니다.
그래서 간단한 문자열 처리도 배열로 해서~~ 손만 아프네요
2번 로직을 보시면 나오는 문자가 이전에 나왔었던 문자라고 했는데, 입력받은 문자열을 전수조사하면서, 해당 문자가 이전에 나왔었는지 체크만 해주면 될 것 같습니다.
바로 코딩 해볼게요
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
int CheckGroupWord(char *str) {
int len;
len = strlen(str);
if(len == 1) {
return true;
}
for(int i = 1; i < len; ++i) {
if(str[i-1] != str[i]) {
for(int j = 0; j < i; ++j) {
if(str[i] == str[j]) {
return false;
}
}
}
}
return true;
}
int main() {
int n;
int cnt = 0;
char str[101];
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%s", str);
if(CheckGroupWord(str)) {
cnt++;
}
}
printf("%d", cnt);
}
해당 문자가 그룹함수인지 구하는 CheckGroupWord 함수를 만들어주었구요,
해당 함수에서 처음 만나는 if문에서 입력받은 문자열이 한 글자라면 해당 문자열? (문자가 맞는 표현이겠네요) 은 그룹단어이기에 예외처리를 해주었습니다.
그리고 다음에 나오는 for 문에서 판별을 해주는데요
문자열 길이만큼 단어를 전수조사를 합니다. 어떤걸 전수조사 하냐!
1. i 번째 단어가 바로 이전 단어와 같지 않다면, 해당 단어는 빌런단어로 판별하여 tracking 해줍니다.
즉, 단어의 연속성이 깨지는 단어가 나오면 우선 빌런으로 판별하여 줍니다.
2. 해당 빌런단어가 등장한 시점인 i번째를 기준으로, 0부터 i번째까지 해당 빌런단어가 나왔었던 적이 있었는지 확인해줍니다.
3. 만약 빌런단어가 나온적이 없었다면 오해해서 미안하다고 사과해주고 완전히 새로운 단어로 인식해준뒤에, continue 해줍니다.
4. 근데 이전에 나왔었던 단어인데 또 등장했다?
바로 검거해줍니다.
5. 모든 루프가 끝났음에도 해당 단어가 살아남았다면, 그룹단어로 판별하여 줍니다.
6. return이 되는부분은 CheckGroupWord 함수를 호출한 부분인데요
main 함수의 if 부분에서 true 값이 return 된다면 그룹단어이기에 카운트해줍니다.
음.. 실버5 문제에서도 뭔가 난이도가 천차만별이네요??