백준 문자열 단어의 개수 풀이
다양한 사례를 생각하지 못해서 연달아 틀리다가 겨우 맞음
풀이
띄어쓰기 -> ' '
문자가 끝난것을 알려주는 기호 -> '\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