백준 10769 - 행복한지 슬픈지

1 minute read

문제링크

문제 접근

  • string 의 find 함수를 활용하여 문자열에서 특정 문자열을 찾도록 접근했다.
  • find(“찾을 문자열”, start_index) 의 매개변수들을 이해하고, 해당 문자열을 찾으면 그 문자열의 첫번째 인덱스를 반환하고, 찾지 못하면 string::npos 를 반환함을 알고 있어야한다.

의사코드(pseudo-code)

- getline(cin, str)
- idx = 0, cnt_happy = 0
- while true:
	- if str.find(":-)", idx) == string::npos: break
	- else:
		- idx = str.find(":-)", idx) + 1
		- cnt_happy += 1
- idx = 0, cnt_sad = 0
- while true:
	- if str.find(":-(", idx) == string::npos: break
	- else:
		- idx = str.find(":-(", idx) + 1
		- cnt_sad += 1
- if cnt_happy==0 && cnt_sad==0: none
- else if cnt_happy == cnt_sad: unsure
- else if cnt_happy > cnt_sad: happy
- else: sad

소스코드 및 분석

전체 코드

#include <iostream>
#include <string>

int main()
{
	std::string str;
	std::getline(std::cin, str);
	int idx = 0, cnt_happy = 0;
	while (true) {
		if (str.find(":-)", idx) == std::string::npos) break;
		idx = str.find(":-)", idx) + 1;
		cnt_happy++;
	}
	idx = 0;
	int cnt_sad = 0;
	while (true) {
		if (str.find(":-(", idx) == std::string::npos) break;
		idx = str.find(":-(", idx) + 1;
		cnt_sad++;
	}
	if (cnt_happy == 0 && cnt_sad == 0) std::cout << "none\n";
	else if (cnt_happy == cnt_sad) std::cout << "unsure\n";
	else if (cnt_happy > cnt_sad) std::cout << "happy\n";
	else std::cout << "sad\n";
}

  • 찾은 문자열의 첫번째 인덱스를 가리키는 idx 를 매번 갱신해주어야한다. 앞에서 해당 문자열을 찾았다면, 그 문자열의 첫번째 인덱스를 가리키고 있으므로 다음 번 탐색 때는 그 다음 인덱스를 가리키도록 설정하여 모든 sub 문자열을 찾도록 한다.

다른 풀이

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string str;
	getline(cin, str);

	int happy = 0, sad = 0;
	for (int i = 0; i < str.size(); i++) {
		if (str[i] == ':' && str[i+1]=='-' && str[i+2]==')') {
			happy++;
			i += 2;
		}
		else if (str[i] == ':' && str[i + 1] == '-' && str[i + 2] == '(') {
			sad++;
			i += 2;
		}
	}
	if (happy == 0 && sad == 0) cout << "none" << endl;
	else if (happy > sad) cout << "happy" << endl;
	else if (happy == sad) cout << "unsure" << endl;
	else cout << "sad" << endl;
}

Leave a comment