백준 문자열 단어의 개수 풀이
다양한 사례를 생각하지 못해서 연달아 틀리다가 겨우 맞음
풀이
띄어쓰기 -> ' '
문자가 끝난것을 알려주는 기호 -> '\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
'문제풀기' 카테고리의 다른 글
[백준/BOJ] 심화 1316번 문제, 그룹 단어 체커 C++ 풀이 (0) | 2023.09.26 |
---|---|
[백준/BOJ] 문자열 2908번 문제, 상수 C++ 풀이 (0) | 2022.10.20 |
[백준/BOJ] 문자열 1157번 문제, 단어 공부 C++ 풀이 (0) | 2022.10.06 |
[백준/BOJ] 문자열 2675번 문제, 문자열 반복 C++ 풀이 (1) | 2022.10.04 |
[ASCII] 아스키코드란, 참고하려고 기록해보는 아스키코드 표 (0) | 2021.12.27 |
[백준/BOJ] 출력 10171/10172번 문제, 개/고양이 C++ 풀이 (0) | 2021.12.13 |