알고리즘 문제/C++

[프로그래머스] Level2 : [1차] 뉴스 클러스터링 - C++

lingk 2020. 7. 6. 17:52
#include <string>
#include <vector>
#include <cstdlib>
#include <cctype>
#include <algorithm>

using namespace std;

vector<string> toSet(string str) {
	vector<string> ret;
	for (int i = 0; i<str.size() - 1; i++) {
		string tmp = "";
		if (isalpha(str[i]) != 0 && isalpha(str[i + 1]) != 0) {
			tmp += toupper(str[i]);
			tmp += toupper(str[i + 1]);
			ret.push_back(tmp);
		}
	}
	return ret;
}
vector<string> sum(vector<string> base, vector<string> other, vector<string> com) {
	base.insert(base.end(), other.begin(), other.end());
	for (int i = 0; i < com.size(); i++) {
		base.erase(find(base.begin(), base.end(), com[i]));
	}


	return base;
}
vector<string> com(vector<string> base, vector<string> other) {
	vector<string> ret;
	for (int i = 0; i<other.size(); i++) {
		if (find(base.begin(), base.end(), other[i]) != base.end()) {
			ret.push_back(other[i]);
			base.erase(find(base.begin(), base.end(), other[i]));
		}
	}
	return ret;
}

int solution(string str1, string str2) {
	int answer = 0;
	int bunmo = 0; int bunja = 0;
	double num = 0;
	vector<string> c;
	vector<string> v1 = toSet(str1);
	vector<string> v2 = toSet(str2);
	c = com(v1, v2);
	bunja = c.size();
	bunmo = sum(v1, v2,c).size();
	if (bunja == 0 && bunmo == 0)
		return 65536;
	num = (double)bunja / (double)bunmo;
	answer = num * 65536;

	return answer;
}

int main(void) {
	solution("aa1+aa2", "AAAA12");
}

toSet함수

toSet함수는 인자로 전달된 String에서 알파벳으로만 이루어진 두 글자를 끊어서 다중집합을 구성하는 함수이다.

사용된 isalpha()함수는 해당 문자가 알파벳이 아니라면 0을 리턴한다.

sum함수

sum함수는 인자로 전달된 base벡터에 other벡터를 붙여준 후, 전달된 벡터com을 삭제하여 합집합을 구성한다.

com함수

com함수는 인자로 전달된 base벡터와 other벡터의 교집합을 구해준다. 해당 문제에서는 중복되는 원소도 인정하므로, other벡터의 원소를 base벡터에서 찾은경우 ret벡터에 추가해주지만, base 벡터에서는 해당 원소를 삭제해 주어야한다.

반응형