반응형

백준 문자열 단어의 개수 풀이

다양한 사례를 생각하지 못해서 연달아 틀리다가 겨우 맞음

 

 

 

 

 

풀이

띄어쓰기 -> ' '

문자가 끝난것을 알려주는 기호 -> '\0'

 

이거 2가지를 미리 알고있으면 문제 푸는게 쉬움

 

 

char 배열의 마지막에는 null 문자가 있어 문자가 끝났다는것을 알수있고 억저고 ~

관련된 깊은 지식은 따로 검색 ㄱㄱ

 

일단 입력 범위가 굉장히 광범위하므로 입력의 크기인 백만개보다 하나 큰 만큼의 char 배열을 만든다음

그 중에서 실제로 사용자가 입력한 만큼만을 입력받아 처리했다

 

cin으로 입력을 받으면 띄어쓰기만 해도 입력이 종료되므로 평소와는 다른 입력 방식을 사용해야 함

getline 을 이용하여 사용자가 입력한 만큼 입력받아 미리 만들어둔 배열에 저장한 다음

 

문자 하나하나 확인하여 처리하면 됨

 

 

입력된 문자열이 (     ) 공백으로만 존재하거나 (     a) 공백부터 시작하여 마지막에 알파벳이 나올수도있으므로

띄어쓰기를 기본으로 숫자를 세지말고 알파벳을 기준으로 단어를 인식하게 함

 

아스키코드를 사용해서 문자의 알파벳 여부를 확인함

외우자

알파벳은 아스키코드 65~90, 97~122이다

 

배열에 저장된 각 문자를 반복해서 돌때 알파벳을 마주치면

그 다음 문자가 공백인지 확인 후, 공백이 맞다면 단어의 개수를 하나 증가시켜주고

공백이 아니라면 계속 알파벳이 나오고 있다는 뜻이므로 그냥 무시했다

 

알파벳이 아닌 배열의 끝을 알리는 \0 문자를 마주친다면

마지막 문자의 바로 앞에 위치한 문자가 공백인지 확인 후, 공백이 아니라면 그것 또한 단어이므로 ex) (a   b)

단어의 개수를 하나 증가시키고 반복을 멈추고 단어의 개수를 출력하면 된다

 

 

코드
#include <bits/stdc++.h>
using namespace std;
int main() {
	int cnt=0;
	char arr[1000001];
	cin.getline(arr, sizeof(arr));
	for(int i=0; i<=sizeof(arr); i++){
    		//a~z 또는 A~Z
		if(65<=arr[i] && arr[i]<=90 || 97<=arr[i] && arr[i]<=122){
			if(arr[i+1] == ' ') cnt++;
		}// ' ', '\0', '\n'
		else{
			if(arr[i] == '\0') {
				if(arr[i-1] != ' ') cnt++;
				break;
			}
		}
	}
	cout << cnt;
	return 0;
}

 

 

 

출처 : https://www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net

 

반응형

+ Recent posts