[c++/알고리즘] 백준 1152 단어의 개수

corncheese·2021년 7월 15일
0

알고리즘문제풀이

목록 보기
4/31

아무리 생각해도 배열에 값을 여러개 저장하고, for문을 뺑뺑 돌리는 방법밖에 생각이 안나서,
풀면서 유용한 STL이 뭔지 찾아보며 풀었던 문제

본 포스팅은 개인학습용으로 작성된 문서입니다. 부족한 점이 있다면 알려주시면 감사하겠습니다 :)

// 백준 1152번 단어의 갯수

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

int main(){
    string a, b;
    int cnt = 0;
    getline(cin, a); //공백까지 함께 입력받으며 개행문자 전까지 입력
    //a = cin.get();// 공백까지 함께 입력 , 개행까지 입력 :: 문자열전용

    if(a.find(' ') == 0){ a.erase(0,1);}

    istringstream ss(a);

    while(getline(ss, b, ' ')){
        cnt++;
    }
    cout << cnt;
}
  • 문제 조건 생각
  1. 입력받는 문자열은 영어 대소문자와 띄어쓰기로 이루어져 있다.
  2. 이 문자열에는 몇 개의 단어가 나올지 구함.
  3. 한 단어가 여러 번 등장하면 횟수만큼 모두 세어야 한다.
  4. 단어는 띄어쓰기 한 칸으로 구분된다.
  5. 공백이 연속해서 나오는 경우는 없다.
  6. 문자열의 앞과 뒤에는 공백이 있을 수도 있다.
  • 문제 풀이
  1. 단어는 띄어쓰기 한칸으로 구분
    문자열을 공백문자 포함하여 개행문자 전까지 입력 받아야 한다
    -> string라이브러리의 getline(cin, string);
    getline(입력스트림 오브젝트, 문자열 저장할 string객체, [종결문자]);

  2. 입력받은 문자열을 '띄어쓰기'로 구분해야 한다.
    -> sstream 라이브러리의 istringstream;
    (?) sstream - string과 stream 을 합쳐버린 라이브러리..?

istringstream
문자열 포맷을 pasing할 때 사용한다.

string a = "ABC abc DE de";
stringstream ss(a);

cout << ss.str();
// 출력결과
ABC adc DE de
  1. ss에 있는 값을 개행문자로 구분하여 다시 count를 세자. -> getline 이용
string a = "ABC abc DE de";
string b;
stringstream ss(a);

    while(getline(ss, b, ' ')){
        cnt++;
    }
    
cout << cnt;

while문을 사용해 더이상 구분할 문자열이 없을때까지
ss를 공백문자를 기준으로 나누어 문자열로 분리해준다.
분리할때마다 cnt를 세어 단어수를 센다.

  1. 문자열 앞에 공백문자가 들어가면, 공백문자를 기준으로 카운트하기 때문에 문자열 앞의 공백문자를 제거해야 한다.
if(a.find(' ') == 0){ a.erase(0,1);}

공백문자의 위치가 0 이면 문자열의 0번째부터 1개의 값을 제거한다.

0개의 댓글