https://www.acmicpc.net/problem/1316
1316번: 그룹 단어 체커
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때
www.acmicpc.net
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
int n = 0, i = 0, toggle = 1, count = 0;
char word[101];
scanf("%d", &n);
for (int k = 0; k < n; k++) {
scanf("%s", word);
for (int i = 0; i < strlen(word); i++)
{
for (int j = 1; j < strlen(word); j++) {
if (word[i] == word[j]) {
if (j - i == 1 || j - i == 0 || j - i == -1) { toggle = 1; i = j; }
else { toggle = 0; break; }//같은 알파벳이 있되 그것이 연속된 값이 아니라면 toggle을 0으로 초기화
}
}
if (toggle == 0) break;
}
if (toggle == 1)count++;
else toggle = 1;
}
printf("%d", count);
return 0;
}
좋은 코드는 절대 아닙니다.
문제에 대해 이해하는 것이 먼저였습니다.
단어 내에 알파벳이 모두 다르다면 1번 이상 연속하므로 그룹 단어입니다.
단어 내 같은 알파벳이 존재한다면,그 인덱스 차이는 +-1이어야 합니다.
위 조건을 고려하여 코드를 짜봤는데 토글 스위치의 아이디어를 활용하였습니다.
같은 알파벳이 연속해있지 않고 한 번이라도 떨어져있는 것이 포착된다면
그룹 단어인지 판별하는 과정을 더 할 필요가 없습니다.
16,19번 줄에 나타납니다.
위 코드에서 가장 중요한 줄은 13번째 줄입니다.
그룹 단어의 요소들끼리 비교하는데
위에서 기술했듯 같은 알파벳이 1번 이상 연속해있다면 그룹 단어입니다.
단어 내에 같은 알파벳이 존재할 때
i의 index가 j의 index보다 클 수도 있고,j의 index가 i의 index보다 클 수도 있고
i의 index가 j의 index와 같을 수 있기 때문에
그 경우를 모두 고려해줍니다.
그렇게 만약 조건문이 충족되면 i값을 j값으로 초기화시켜줘야하는데
이유는 bbbbaa같이 인덱스 0번과 1번이 연속하면 1번과 2번을 비교해야하는데
초기화 시켜주지 않는다면 0번과 2번을 비교하게 되고
그룹 단어임에도 그룹 단어로 인지하지 못하게 됩니다.
같은 알파벳이 있지만 모두 연속하다면 toggle 변수는 1로 초기화 되어 그룹 단어로 인지되어 count변수가 1증가합니다.
kin같은 1번씩 연속하는 단어는 처음 toggle변수를 초기화할 때 1로 초기화하였으므로 조건문에 걸리지 않고
그룹 단어로 인지되어 count변수가 1증가합니다.
정말 정직하게 풀었습니다. 다른 분들의 코드를 보니 입력받은 단어의 개수에서 그룹 단어가 아닌 것을 빼주는 방법을 채택하였습니다.
위 방식이 가능했던 이유는 저처럼 연속하는 것에 집중하기 보단 오히려 연속하지 않는 것에 집중하였습니다.
즉,문자가 바뀔 때를 기준으로 판별했었습니다.
다른 사람의 코드
#include <stdio.h>
#include <string.h>
int main()
{
char input_words[101]; //문자열 배열
int N ; //input 값 N
scanf("%d", &N);
int count = N;
for (int i = 0; i < N; i++)
{
char first = '0';
int Alphabet[26] = {0, };
scanf("%s", input_words);
for (int j = 0; input_words[j] != '\0'; j++)
{
if (first != input_words[j])
{
first = input_words[j];
Alphabet[input_words[j]-'a'] += 1;
}
if (Alphabet[input_words[j] - 'a'] == 2)
{
count -= 1;
break;
}
}
}
printf("%d", count);
return 0;
}
출처 : https://abcdefgh123123.tistory.com/182
그 과정에 있어 알파벳 배열을 선언하여 활용한 것이 인상적이었습니다.
반드시 더해야만 하나 빼줄 수는 없나를 항상 고민해보는 습관을 들여야겠습니다.
'Baekjoon' 카테고리의 다른 글
[C] 백준 1978번 : 소수 찾기 (0) | 2023.01.26 |
---|---|
[C] 백준 2839번 : 설탕 배달 (0) | 2023.01.25 |
[C] 백준 2775번 : 부녀회장이 될테야 (0) | 2023.01.20 |
[C] 백준 10250번 : ACM 호텔 (개선) (0) | 2023.01.19 |
[C]백준 2869번 : 달팽이는 올라가고 싶다 (0) | 2023.01.19 |