링크 : https://www.acmicpc.net/problem/1152
문제
문제 풀이
C++ 상세 풀이
공백까지 입력받기 위해 getline을 써 준다.
단어의 앞 뒤로 모두 공백이 올 수 있으므로, isspace 함수를 활용해 공백(탭, 개행 모두 포함)인지 판단한다. 참고로 isspace 함수는 공백이면 0이 아닌 수를 반환한다.
void solution(string str)
{
int len = str.length();
int cnt = 0;
for (int i = 0; i < len; i++)
{
if (isspace(str[i]))
if (isspace(str[i]) != 0 || isspace(str[i + 1]) != 0)
cnt++;
}
if (isspace(str[0]) == 0 && isspace(str[len - 1]) == 0)
cnt++;
if (isspace(str[0]) != 0 && isspace(str[len - 1]) != 0)
cnt--;
cout << cnt;
}
내가 사용한 아이디어는 우선 i 인덱스에 있는 문자가 공백인지 판단한 후, 공백이라면 해당 문자와 다음 문자를 확인해 둘 중의 하나라도 공백이 아니라면 단어라고 생각할 수 있으니 cnt를 늘려준다. 여기서 cnt는 단어 수이다.
당연하게도 위의 경우에 예외가 존재한다. 맨 앞과 맨 끝으로, 코드에서 적어놓은 바와 같이 맨 앞과 끝이 공백이 아니라면 cnt가 하나 늘어나야 한다. 반대로 맨 앞과 맨 끝이 공백이라면 cnt가 하나 줄어야 한다.
예로 The Curious Case of Benjamin Button 보자. 이는 맨 앞과 끝 모두 공백이 아닌 경우이다. 처음 for문에서 공백인 부분이 5개 있고, 모두 if문 조건에 충족하니 cnt는 5가 되어있을 것이다. 그러나 실질적인 단어의 수는 6개이다. 앞서 if문에서 걸러지지 않는 맨 앞과 맨 뒤를 모두 판단하는 조건문이 필요하며, 이는 이후 if문에서 판단하게 된다.
별로 효율적이지는 않은 알고리즘 같다. STL을 알지 못했을 시절의 풀이라, 아마 지금 다시 푼다면 훨씬 효율적인 해결 방법이 있을 것 같다.
..그래서 풀어봤다.
#include <iostream>
#include <string>
int solution(std::string text) {
int res = 1;
for (int i = 0; i < text.length(); i++) {
if (text[i] == ' ')
res++;
}
if (text[0] == ' ')
res--;
if (text[text.length() - 1] == ' ')
res--;
return res;
}
void init() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
}
int main() {
init();
std::string text;
getline(std::cin, text);
std::cout << solution(text);
return 0;
}
string 헤더파일을 사용하긴 했지만 훨씬 간단하게 풀 수 있었다.
Python 상세 풀이
파이썬은 너무 허무하게 풀리기 때문에 따로 풀이를 적지는 않겠다.
C++ 코드 전문
Python 코드 전문
소감
정말 볼때마다 감회가 새로운 문제다. 친구가 풀어달라고 링크를 줬을 시기에는 그 친구도, 나도 코딩의 코자도 모르는 초보였는데 어느새 여기까지 수준이 올라왔다는 데에 놀라울 따름이다.
'◎ 자료구조와 알고리즘 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 / BOJ] 5622번 다이얼 (C++, Python) (0) | 2022.01.17 |
---|---|
[백준 / BOJ] 2908번 상수 (C++, Python) (0) | 2022.01.17 |
[백준 / BOJ] 1157번 단어 공부 (C++, Python) (0) | 2022.01.17 |
[백준 / BOJ] 2675번 문자열 반복 (C++, Python) (0) | 2022.01.17 |
[백준 / BOJ] 10809번 알파벳 찾기 (C++, Python) (0) | 2022.01.17 |
자기계발 블로그