' [C/C++] 백준 1152번 C++ 풀이

Programming/C & C++

[C/C++] 백준 1152번 C++ 풀이

mdisprgm 2021. 9. 1. 14:24
728x90

이 문제는 입력받은 문자열의 단어의 개수를 구하는 문제이다.

 

문제를 풀기 위해서 해결해야 하는 과제는 두 가지가 있다.

 

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;
}

 

 

오늘의 교훈.. 조건을 꼼꼼히 읽자.

종종 수고를 덜어주는 조건도 있는데 괜히 그것까지 고려해서 코드짜다 헛수고함..ㅎ

예를 들면 이번 문제에서 '공백은 연속해서 나오지 않는다'든가

728x90

'