www.acmicpc.net/problem/19844

 

19844번: 단어 개수 세기

첫째 줄에 “문장”을 나타내는 문자열이 주어진다. 이 문자열은 영어 소문자, 띄어쓰기, -(하이픈), '(어포스트로피)로만 이루어져 있다. 이때 띄어쓰기, 하이픈, 어포스트로피 중 어느 것도 인��

www.acmicpc.net


  • 주어진 조건을 얼마나 꼼꼼하게 코딩했는지가 중요한 문제이다.
  • getline 등으로 띄어쓰기 구분없이 문자열 받는게 훨씬 나았을 것 같은데, 굳이 getc(stdin) 으로 입력종료될때까지 string 들을 입력받아 벡터에 넣었다.
  • 어퍼스트로피로 구분되는 단어의 경우, 앞에 오는 ce, je, ..., si 들이 '문자' 가 아닌 '단어' 로 와야 된다는 조건을 찾기 힘들었다.
  • 뭔가 좋은 문제는 아닌 것 같다.

#include <iostream>
#include <vector>

using namespace std;

int number;
string temp;
vector<string> lines;
char moum[6] = {'a','e','i','o','u','h'};
char uppe[8] = {'c','j','n','m','t','l','d','s'};

int main(void)
{
    do
    {
        cin >> temp;                                        // 띄어쓰기 단위로 문자열 입력 받음
        lines.push_back(temp);
    } while(getc(stdin) == ' ');

    number = lines.size();                                  // 띄어쓰기로 구분된 단어 갯수 카운트
    for(int w = 0 ; w < lines.size() ; w++)                 // 각 단어별로 다시 검사
    {
        string line = lines[w];
        for(int i = 1 ; i < line.size() - 1 ; i++)
        {
            if(line[i] == '-')                              // 단어 사이에 하이픈이 들어가있으면 구분
            {
                number++;
            }
            else if(line[i] == '\'')                        // 만약 중간에 어퍼스트로피가 있을 경우
            {
                bool mo = false;
                for(int m = 0 ; m < 6 ; m++)                // 바로 뒤의 문자가 모음에 속하는지 검사
                {
                    if(line[i+1] == moum[m]) mo = true;
                }
                if(mo)                                      // 뒤의 문자가 모음일 경우에
                {
                    bool word = false;
                    if(i == 1 || (i > 1 && line[i-2] == '-'))
                    {
                        for(int up = 0 ; up < 8 ; up++)     // 앞의 문자 1개가 주어진 조건에 속해있는지 검사
                        {
                            if(line[i-1] == uppe[up])
                            {
                                word = true;
                                break;
                            }
                        }
                    }
                    if(i == 2 || (i > 2 && line[i-3] == '-'))   // 혹은 앞의 문자 2개가 qu 인지 검사
                    { 
                        if(line[i-2] == 'q' && line[i-1] == 'u') word = true;
                    }
                    if(word) number++;                      // 앞에 온 값들이 조건에 맞고 뒤에도 모음이 왔다면 단어로 구분
                }
            }
        }
    }

    cout << number << endl;
}

 

'PS > BOJ' 카테고리의 다른 글

[백준] 2468 : 안전 영역  (0) 2020.09.15
[백준] 4963 : 섬의 개수  (0) 2020.09.14
[백준] 2156.cpp : 포도주 시식  (0) 2020.09.11
[백준] 1904.cpp : 01타일  (0) 2020.09.09
[백준] 1158.cpp : 요세푸스 문제  (0) 2020.09.08

+ Recent posts