https://www.acmicpc.net/problem/1316
단어에서 각 문자가 연속해서 나타날 때 그 단어를 그룹 단어라고 한다.
예를 들어 aaabbc는 a,b,c가 연속해서 나타났기 때문에 그룹 단어이다.
반면 aaabbca는 a가 연속해서 나타나지 않았기 때문에 그룹 단어가 아니다.
이 문제를 살짝 어렵게 풀었다.
문자열을 저장하고 있는 배열을 S라고 하자.
aaabbc가 그룹 단어인지 확인하기 위한 알고리즘의 초기 상태는 아래와 같다.
S[jump]와 S[j]가 같은지 비교하고 인덱스 차이가 1인지 확인한다.(인덱스 차이가 1이 아니면 문자가 연속해서 나타난 것x)
문자가 연속해서 나타났다면 jump에 j값을 저장한다. (S[j]가 연속한 문자군 중에서 마지막일 때 바로 jump이후로 넘어가기 위함)
두 번째 실행한 모습은 아래와 같다.
세 번째 실행한 모습은 아래와 같다.
여기서 연속하는 'a'가 끝난다.
만약 aaabbca처럼 'a'가 연속하지 않는 경우는 어떻게 될까?
위 그림처럼 S[jump]와 S[j]는 같지만 인덱스 값 차이가 1이 아니기 때문에 그룹 단어라고 볼 수 없다.
이 경우 그룹 단어가 아님을 알았으니 그룹 단어로 세지 않고 알고리즘을 종료한다.
정상적으로 종료되는 경우를 생각해보자.
위 그림은 j를 계속 증가시켜 S[jump]와 S[j]가 같은지 비교했지만 더 이상 같지 않은 문자가 등장하지 않았다.
'a'를 갖고 문자열의 각 문자를 모두 비교하면 i는 'b'로 점프해 쓸데 없이 비교하는 경우를 줄인다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include<stdio.h> #define TRUE 1 #define FALSE 0 int main() { int N; char tempStr[101]; int jump = 0; int beGroup = TRUE; int count = 0; scanf("%d",&N); for (int i = 0; i < N;i++) { scanf("%s",tempStr); for (int i = 0; tempStr[i] != NULL; i++) { jump = i; for (int j = i + 1; tempStr[j] != NULL; j++) { if (tempStr[jump] == tempStr[j] && (j - jump) == 1) { jump = j; } else if (tempStr[jump] == tempStr[j] && (j - jump) != 1) { beGroup = FALSE; break; } } i = jump; if (beGroup == FALSE) break; } count += beGroup; beGroup = TRUE; } printf("%d\n",count); system("pause"); return 0; } | cs |
'백준' 카테고리의 다른 글
2775)부녀회장이 될테야 (0) | 2019.01.16 |
---|---|
5622)다이얼 (0) | 2019.01.16 |
2920)음계 (0) | 2019.01.15 |
8958)OX 퀴즈 (0) | 2019.01.15 |
1065)한수 (0) | 2019.01.14 |