BOJ 문제번호 1152

이 문제를 풀때, 문자열을 다루는 것에 익숙하지 않아 코드 작성에 애를 먹었던 기억이 있습니다. 기본적으로 C언어나 C++을 공부하신 분들은 string클래스를 활용하시면 보다 편리하게 풀 수 있으실 겁니다. 일단 문장을 입력받아야 하기때문에 gets()함수를 이용해서 입력을 받았습니다. 그리고 문장에서 단어의 개수를 판단하는 기준은 보통 띄어쓰기를 기준으로 나누어져있기 때문에 그 기준을 이용하여 코드를 작성했습니다. 하지만 2번째 예제를 입력했을때 올바른 정답이 나오지 않았었는데, 2번째 예제를 자세히 보면 띄어쓰기로 시작을 하는 것을 볼 수 있습니다. 그 부분 때문에 단어 한개를 추가로 인식하는 오류가 발생해서 flag라는 변수를 추가했습니다.

flag함수를 활용해서 문장을 인식하는 방법은 제가 임베디드때 센서 활용을 할때 자주 쓰던 방법입니다. 운영체제 과목을 수강할 당시 Test And Set이라는 기법에서 응용한 것입니다. 즉 내가 원하는 상태일때를 알려주는 변수입니다. C++을 활용하기 때문에 bool type을 활용하여 내가 알고자 하는 상황을 감지할 수 있습니다. 쉽게말해서 이 문제의 경우 내가 지금 문장을 앞에서부터 한글자 한글자 읽어나가고 있을 때, 지금 읽고있는 글자가 알파벳인지 공백문자인지를 구별하기 위한 변수라고 생각하면 됩니다. 내가 지금 현재 읽고 있는 문자가 알파벳일 경우 flag는 true로 초기화 시켜주면, 코드 내에서 알파벳을 읽고 있을때 동작 특성을 정해줄 수 있습니다.

이렇게 flag함수를 넣어주게 되면 처음에 공백부터 시작하는 문자열이나 끝에 공백이 들어가는 문자열이 오더라도 정확하게 단어의 개수만 측정할 수 있도록 할 수 있습니다.


* Key Point

1. 문자열을 구분하려면 공백을 기준으로 구분한다.

2. 문자열 중 시작부분과 끝부분에 공백이 올때의 오류를 처리해야 한다.

3. 문자열에서 내가 읽고 있는 것이 알파벳인지 공백문자인지 구분해야 한다.


#include <iostream>
#include <stdio.h>

#define MAX 1000001     // 입력받을 수 있는 문자열의 최대 크기
using namespace std;

int main() {
	char str[MAX];      // 입력 받은 문자열을 저장하는 변수
	int index = 0;         // 배열을 탐색할 위치 변수
	int answer = 0;         // 단어의 개수
	bool flag = false;      // 띄어쓰기 구분을 위한 flag

	gets(str);      // 문자열을 입력

	while (str[index] != '\0') {
		if (str[index] != ' ')
			flag = true;        // 처음에 띄어쓰기로 시작한 부분때문에 문장이 시작한 것을 알기 위한 장치
		else if(str[index] == ' ' && flag ) {
			flag = false;
			answer++;
		}       // 띄어쓰기를 기준으로 단어의 개수를 세도록 설정
		index++;
	}
	if(flag)
		answer++;       // 띄어쓰기를 기준으로 했기 때문에 마지막 단어를 세기 위한 작업

	printf("%d\n", answer);

}

채점 결과

 

+ Recent posts