이 문제는 입력받은 문자열의 단어의 개수를 구하는 문제이다.
문제를 풀기 위해서 해결해야 하는 과제는 두 가지가 있다.
1. 공백도 문자열에 포함해서 입력받기
2. 공백을 제외한 다른 알파벳들의 묶음(단어의 개수) 수 세기
이게 필자의 제출 기록인데 보다시피 실패가 아주 많다..ㅋㅋ
문자열을 그냥 입력받으면 공백으로도 구분된다는 것과
문자열 앞뒤로 공백이 나올 수 있다는 조건을 간과하여 5번이나 틀렸다.
결국 못참고 정답을 찾아봤는데..
▼구글에서 찾은 정답 보기
#include <iostream>
#include <string>
int main() {
std::string str;
int count = 0;
while (std::cin >> str) {
++count;
}
std::cout << count;
}
cin의 반환값을 조건에 대입할 생각을 못했다..ㅋㅋ
scanf는 반환값을 변수에 대입할 수 있는데 cin은 참조 연산이 불가능하기 때문에
못하는 줄 알았지만 저렇게 하니 제출이 되더라.
그런데 이 코드에는 흠이 하나 있는데, 바로 개인 컴퓨터로 실행하면 입력이 멈추지 않는다는 것이다.
즉, Ctrl + Z나 Ctrl + C로 중지시켜야 멈춘다.
개인 컴퓨터로 테스트가 잘 되어야 백준에 제출하는 내 성향이
백준에서만 작동되는 코드는 알 수 없다는 문제가 있었...
암튼 그래서 개인 컴퓨터와 백준 모두 잘 작동하는 답안을 작성하고 싶어서
ISCHAR 매크로는 함수로 만들 수도 있었지만 가끔 매크로 흑마법이 쓰인 답안을 볼 때마다 경이로워(?)서 한번 흉내내봤음!
▼ 직접 작성한 답안 보기
#include <iostream>
#include <string>
#define ISCHAR(x) (x - 65 >= 0 && x - 65 <= 25 ? true : x - 97 >= 0 && x - 97 <= 25 ? true : false)
int main() {
std::string word;
std::getline(std::cin, word);
int cnt = 0;
for (int i = 0; i < word.length(); i++) {
if (ISCHAR(word[i])) {
cnt++;
while (word[i] != ' ' && i < word.length()) i++;
}
}
std::cout << cnt << std::endl;
}
오늘의 교훈.. 조건을 꼼꼼히 읽자.
종종 수고를 덜어주는 조건도 있는데 괜히 그것까지 고려해서 코드짜다 헛수고함..ㅎ
예를 들면 이번 문제에서 '공백은 연속해서 나오지 않는다'든가
'Programming > C & C++' 카테고리의 다른 글
[C/C++] 9.5강 - for, while에서 break, continue (0) | 2022.01.17 |
---|---|
[C/C++] 9.4강 - switch & break | 제어문, 조건 관리하기 (0) | 2022.01.15 |
[C/C++] 백준 1157번 C++ 풀이 (0) | 2021.08.30 |
[C/C++] Win32 API 첫 예제! (0) | 2021.08.24 |
[C/C++] 9.3강 - 제어문, 조건 관리하기 (for 사용법) (0) | 2021.08.17 |