[C++] getline 함수를 이용해 공백 포함 문자열 받기 / 백준 - 단어의 개수(1152)

zae·2022년 7월 10일
2

programming C/C++

목록 보기
1/8
post-thumbnail

Velog는 수입 창출이 없는 곳이니 맘 편히 백준 업로드 하도록 하겠습니다 :)

cin

단순 cin을 통해 문자열을 입력받게 된다면, 공백을 기준으로 입력받기 때문에
abcd efghabcd로 입력 받게 됩니다.

#include <iostream>
using namespace std;

int main(){
	string a;
    cin >> a; // 입력 : abcd efgh
    
    cout << a.length() << "\n"; // 출력 : 4 (원하는 결과 : 9)
    cout << a << "\n"; // 출력 : abcd (원하는 결과 : abcd efgh)
}

이를 보완할 수 있는 함수가 바로 getline( )입니다!

getline()

  • header : string
  • 함수 사용 : getline(cin, 받을 변수)

공백을 포함하여 입력 창에 들어오는 모든 문자열을 받아오는 함수입니다.

👀백준 - 단어의 개수(1152)👀를 통해 알아보자!

백준 1152번: 단어의 개수 출처 🥉브론즈 2

질문 : 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력 : 첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.
출력 : 첫째 줄에 단어의 개수를 출력한다.

알고리즘 분류 : 구현, 문자열

코드 설명

  1. getline(cin, sen)을 통해 공백 포함 문자열을 입력받는다.
  2. 문자열을 인덱스로 접근할 때 인덱스 초과를 하지 않기 위해 len 변수에 입력 받는 문자열 sen길이를 넣어준다.
  3. 첫 번째 if : i = 0이고 맨 앞글자가 공백이 아닐 때(영문자일 때) ex) The zae
  4. 두 번째 if : 공백일 경우 그 다음 문자가 영문자면 단어 시작!
#include <iostream>
#include <string>
using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int cnt = 0;
    string sen;

    getline(cin, sen); // getline()을 통해 문자열 입력받기
    int len = sen.length();
    for (int i = 0; i < len; i++){
        if (i == 0 && sen[0] != ' ') { // 맨 앞글자가 공백 X
            cnt++;
            continue;
        }
        if (sen[i] == ' '){
            if (i+1 == len) break; // 접근할 수 없는 인덱스
            if ((sen[i+1] >= 'a' && sen[i+1] <= 'z') || (sen[i+1] >= 'A' && sen[i+1] <= 'Z')){
                cnt++;
                i++; // 뛰어넘기
            }
        }
    }

    cout << cnt;
    return 0;
}
profile
코린이 성장 과정! 깊이 있게 파고들 공부를 탐색하고 있습니다 :)

0개의 댓글