[백준 1316] 알고리즘을 만들기까지....

Groundstone51·2023년 11월 14일

백준 혼공

목록 보기
1/7

문제

연속된 알파벳 카운터 만들기.

문제에서 말하는 연속된 알파벳 배열은 다음과 같다.
1. abc 한번에 나오는 것
2. aaabbcc 여러번 나오더라도 마지막 알파벳이 앞의 것과 같고 뒤에는 같은 것이 나오지 않는 것.

즉, aabbccsa는 연속된 알파벳 배열이 아니다.

문제에서 요구하는 조건

1.입력
문장의 개수 n을 입력받는다. (0<n<=100)
2.출력
연속된 배열로 이뤄진 문장의 수를 출력한다.

풀이

초반

처음에는 문장을 입력받으면 이중배열을 이용해 하나씩 비교하려고 했다.
생각해보니 그 방향이 아니었다. 배열 내에서 카운트를 하는 게 아니기 때문이다.
그렇다면 배열에서 기준점을 잡아서 앞뒤로 분석을 해야하나 싶어서 만약 input[i]가 주어진다면 input[i-1]과 input[i+1]을 비교하려고 했다. 그런데 그렇게 한다면 일단 input[0]과 input[strlen(input)]에서 좀 애매해진다. 그리고 반복되지 않는 abc같은 배열도 연속된 알파벳의 배열인데 이런 배열은 셀 수가 없다.
어쩔 수 없이 오늘도 구 선생님의 도움을 받았다.

구선생님의 피드백

  • 연속된 알파벳의 종류에는 abc같은 배열과 aabbcc같은 배열이 있다.
  • 여러 알파벳 중에서도 문제는 알파벳 소문자만을 대상으로 하고 있고 abc나 abbccc나 결국 같은 배열이라고 취급되기에 알파벳을 세는 것이 필요하다.
  • 입력되는 배열 이외에 알파벳의 개수를 세는 배열을 만들어서 배열의 요소가 2이상이 된다면 연속된 배열이 아닌 것이다.
#include<stdio.h>
#include<string.h>
int main() {
	int n;
	char input[101];
	
	scanf("%d", &n);//입력받는 배열의 개수
	int count = n;
	for (int i = 0; i < n; i++) {
		scanf("%s", input);
		int len = strlen(input);
		char first = 0;
		int cnt[26] = { 0 };
        /*n번 동안 문장을 입력받고 비교를 위해 사용하는 배열과 변수를 초기화*/
		for (int j = 0; j < len; j++) {
			if (first != input[j]) { //만약 앞의 알파벳과 다르다면 
				first = input[j];//그 알파벳을 새로운 기준으로 잡고 
				cnt[input[j] - 'a'] += 1;//그 알파벳의 수를 센다.
			}
			if (cnt[input[j] - 'a'] == 2) {
				count -= 1;
				break;
                /*만약 한 문자가 문장에 두개 이상 카운트된다면 연속된 문장이 아니므로 총 문장개수에서 하나를 빼고 반복문을 종료한다.*/ 
			}
		}
	}
	printf("%d", count);
	return 0;
}

반성할 점

일단 문제에서 요구하는 것이 무엇인지 파악하는 것이 필요하다. 문제를 읽고나서 빠르게 답을 내어야 하는 대한민국식 입시교육과 공무원 시험에 특화된 문과식 교육이 아직 몸에 배여 있어서 문장을 제대로 이해하기도 전에 코드를 입력하고 있다. 일단 문제에서 원하는 입력과 출력을 보고 이걸 해결하기 위해서 어떤 알고리즘을 구현해야 하는지 진득하게 고민해야 한다.

profile
I'm always be here. Because I'm stone

0개의 댓글