https://www.acmicpc.net/problem/1152

문제를 읽고 조금은 당황했을 수 있지만, 천천히 생각해보자. 문제가 주는 조건을 하나하나 적어보면,
- 공백을 포함한 문자열을 주겠다.
- 문자열에 연속된 공백은 없으며, 문자열 맨 앞과 맨 뒤에 공백이 있을 수 있다.
위의 2가지 조건을 유념하면서 코딩전에 생각을 해보자.
공백을 포함한 문자열을 주겠다.
-> 그렇다면 cin 보다는 공백을 포함해서 입력받을 수 있는 getline을 쓰자.
문자열에 연속된 공백은 없으며, 문자열 맨 앞과 맨 뒤에 공백이 있을 수 있다.
-> 맨 앞과 맨 뒤에 공백이 있는 경우, 조건문을 통해 count 횟수를 한번씩 빼주자.
내 생각에는 이 조건만 만족한다면, 엣지케이스가 존재하지 않을 것 같고 충분히 솔루션이 될 것 같다.
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
getline(cin, s);
if(s.empty()){
cout <<"0";
}
int cnt = 1;
for(int i = 0; i < s.length(); i++){
if(s[i] == ' '){
cnt++;
}
}
if(s[0] == ' '){
cnt --;
}
if(s[s.length()-1] == ' '){
cnt --;
}
cout << cnt;
return 0;
}
조금 헷갈렸던 부분은, 공백이 1개 == 단어가 2개가 있다는 것을 의미한다는 것이다.
ex) "The Curious" 는 공백은 하나이지만 2개의 단어이다. 따라서, count 변수 선언 시 0이 아닌 1로 초기화하여 사용해야한다. (최종 출력 전에 +1 해주어도 된다.)
int cnt = 1; for(int i = 0; i < s.length(); i++){ if(s[i] == ' '){ cnt++; } }
또한, 공백을 count 하는 조건문에서 ' '(작은따옴표) 대신 " "(큰 따옴표)를 사용하니 컴파일 에러가 발생하였다. 찾아보니, 큰 따옴표는 문자열 에 대한 단축 구문이며, 단일 문자를 비교하려면 작은따옴표를 사용해야 한다.
for(int i = 0; i < s.length(); i++){ if(s[i] == ' '){ cnt++; } }
참고 : https://stackoverflow.com/questions/14544043/operand-types-are-incompatible-char-and-const-char