• Home
  • About
    • on Weekend photo

      on Weekend

      𝙎𝙩𝙪𝙙𝙮𝙞𝙣𝙜

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • 필사
  • Projects

[백준] 1152 단어 갯수 세기 (C++)

06 Jan 2020

문제는 여기

설명

1152번의 경우에는 다른 문제들에 비해 정답률이 꽤 낮은 편인데, 그 이유는 앞과 뒤에 공백이 들어갈 수 있기 때문인 것 같다.

이러한 경우를 처리하기 위한 간단한 방법을 적어두고자 한다.

우선 테스트케이스로 넣을 내용은 5가지이다.

(1) “aa”
(2) “ aa” (맨 앞 공백)
(3) “aa “ (맨 뒤 공백)
(4) “ aa aa “ (맨 앞, 맨 뒤 공백)
(5) “ “ (white space 1개)

이를 처리하기 위해 사용하는 변수는 다음과 같다.

(1) 공백이 아닌 문자가 등장하였는지 체크하는 플래그 변수
(2) 공백이 등장하였는지 체크하는 플래그 변수
(3) 맨 첫 부분인지 체크하는 플래그 변수

사실상 (3)의 경우에는 for loop을 돌리기 전에 맨 앞을 체크하고, 그 이후부터 for loop에 포함시키는 편이 효율적이긴 하다. (for loop 내부에서 매번 flag를 체크할 것이기 때문이다.)

사용법은 아주 쉽다. 단어는 ‘공백과 공백 사이에 공백이 아닌 문자가 1개 이상 있는 경우’로 처리하고, 입력된 문자열의 맨 앞과 맨 뒤에 ‘무조건 공백이 있게끔’ 한다. 직접 문자열에 넣기보단 플래그들을 이용해 컴퓨터가 앞 뒤에 무조건 공백이 나온다고 가정하도록 처리해주면 된다.

바로 코드로 들어가자.

코드

#include <iostream>
#include <string>

using namespace std;

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

  string s;
  getline(cin, s);

  int flag=0;
  int space=0;
  int word=0;
  int cnt=0
  for(string::iterator it=s.begin();it!=s.end();it++)
  {
    if(flag==0) //첫 부분인지 체크하기 위함
    {
      space=1; //공백은 무조건 있다고 가정하자.
      if(*it != ' ') word=1; //맨 앞에는 무조건 공백이 있다고 가정했으니, 공백이 아닌지 체크해준다.
      flag=1; //이제 첫 부분인지 체크할 필요가 없다.
    }
    else
    {
      if(*it != ' ') word=1; //공백이 아니라면 단어 플래그는 1이 된다.
      if((*it == ' ')&&(word==1)&&(space==1)) //이전에 공백이 있었고, 단어도 나왔었는데, 지금은 공백이라면 cnt++ 해주고 플래그들을 초기화해준다.
        {
          cnt++;
          word=0;
          space=1; //현재 공백이므로 space 플래그는 1이다.
        }
      }
  }

  if((word==1)&&(space==1)) cnt++;
  //맨 마지막 부분에 공백이 있게끔 생각하게 만드는 부분이다. for loop이 끝나고 한 번 더 체크한다. 단어가 나왔었고, 그 이전에 공백도 있었다면 cnt++. 맨 마지막 부분에 공백이 있었다면 word=0이 되어있을 것(이미 단어 갯수로 쳤을 것)이다. 그러나 맨 마지막 부분에 공백이 없었다면 word=1, space=1인 상태로 단어로 쳐지지 않은 상태로 남아있을 것이다.
  cout << cnt << '\n';
  return 0;
}

위 내용은 공백이 연속해서 나오는 경우에도 약간의 수정을 통해 사용 가능합니다!



problem_solvingc++ Share Tweet +1