풀이 과정
소문자와 대문자의 차이는 무시한다고 했으니 초반에 다 소문자로 바꿔준다.
그리고 두 글자씩 끊어서 다중집합을 만들기 때문에
str1의 집합들을 v1벡터에 넣고, str2의 집합들을 v2벡터에 넣는다.
v1의 크기와 v2의 크기를 더하면 중복을 포함한 합집합이 된다.
교집합을 구할 땐 find 함수를 써서 교집합이 있다면 그 수를 삭제해주고 카운트를 해준다.
중복 포함 합집합에서 교집합을 빼면 중복을 포함하지 않은 합집합 수가 나온다.
그러므로 답은 교집합 / 중복 미포함 합집합 * 66536이 된다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(string str1, string str2) {
int answer = 0;
// 대문자 -> 소문자
for(int i = 0; i < str1.size(); i++){
if('A' <= str1[i] && str1[i] <= 'Z') str1[i] += 32;
}
for(int i = 0; i < str2.size(); i++){
if('A' <= str2[i] && str2[i] <= 'Z') str2[i] += 32;
}
// 집합 만들기
vector<string> v1;
for(int i = 0; i < str1.size(); i++){
if('a' <= str1[i] && str1[i] <= 'z' && 'a' <= str1[i + 1] && str1[i + 1] <= 'z'){
string str = "";
str += str1[i];
str += str1[i + 1];
v1.push_back(str);
}
}
vector<string> v2;
for(int i = 0; i < str2.size(); i++){
if('a' <= str2[i] && str2[i] <= 'z' && 'a' <= str2[i + 1] && str2[i + 1] <= 'z'){
string str = "";
str += str2[i];
str += str2[i + 1];
v2.push_back(str);
}
}
// 중복 포함 합집합
int h = v1.size() + v2.size();
// 교집합
int g = 0;
if(v1.size() > v2.size()){
for(int i = 0; i < v2.size(); i++){
auto iter = find(v1.begin(), v1.end(), v2[i]);
if(iter != v1.end()){
v1.erase(iter);
g++;
}
}
}
else {
for(int i = 0; i < v1.size(); i++){
auto iter = find(v2.begin(), v2.end(), v1[i]);
if(iter != v2.end()){
v2.erase(iter);
g++;
}
}
}
// 중복 미포함 합집합
int b = h - g;
if(b == 0) answer = 65536;
else answer = (double)g / b * 65536;
return answer;
}
'🍞 Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스][Level2] 구명보트 c++ (0) | 2022.10.21 |
---|---|
[프로그래머스][Level2] 가장 큰 수 c++ (0) | 2022.10.21 |
[프로그래머스][Level2] H-Index c++ (0) | 2022.10.21 |
[프로그래머스][Level2] 프로세스 c++ (0) | 2022.10.21 |
[프로그래머스][Level2] 타겟 넘버 c++ (0) | 2022.10.21 |