아무코딩

[2018 KAKAO BLIND RECRUITMENT 1차] 뉴스 클러스터링 본문

알고리즘/프로그래머스

[2018 KAKAO BLIND RECRUITMENT 1차] 뉴스 클러스터링

동 코 2020. 5. 7. 11:30

문제풀이

새로운 STL을 많이 적용해 볼수 있는 문제였다.

교집합과 합집합을 구해 나누는 문제이다.

 

이전에 풀때는 함수를 사용하지 않고 직접 구현하였지만 이번엔 있는 stl을 활용해서 풀어보았다.

 

아래에 교집합 합집합 stl을 사용 하기전에 각 벡터는 정렬을 해주어야한다.

 

1. 교집합.

vector<string> inter_result;
set_intersection(vecA.begin(), vecA.end(), vecB.begin(), vecB.end(), back_inserter(inter_result));

back_inserter를 이용하면 resize를 이용하여 미리 크기를 정해두지 않고 새로운 컨테이너에 삽입할 수 있다.

 

2. 합집합.

vector<string> union_result;
set_union(vecA.begin(), vecA.end(), vecB.begin(), vecB.end(), back_inserter(union_result));

 

그리고 자주 사용하는 대문자 -> 소문자 string 반환함수도 깔끔하게 짜놓았다.

string changeLowerCaseStr(string str){
    for(int i=0;i<str.size();i++){
        if(str[i] <='Z' && str[i] >='A')
            str[i] = str[i] -('A'-'a');
    }
    return str;
}

 

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
vector<string> setA;
vector<string> setB;
vector<string> union_result;
vector<string> inter_result;
 
string changeLowerCaseStr(string str){
    for(int i=0;i<str.size();i++){
        if(str[i] <='Z' && str[i] >='A')
            str[i] = str[i] -('A'-'a');
    }
    return str;
}
 
bool isValidSubStr(string str,int i){
    if(str[i]<='z'&&str[i]>='a'&&str[i+1]<='z'&&str[i+1]>='a')
        return true;
    return false;
}
int solution(string str1, string str2) {
    int answer = 0;
    str1 = changeLowerCaseStr(str1);
    str2 = changeLowerCaseStr(str2);
    
    for(int i=0;i<str1.size()-1;i++){
        if(isValidSubStr(str1,i))
            setA.push_back(str1.substr(i,2));
    }
    for(int i=0;i<str2.size()-1;i++){
        if(isValidSubStr(str2,i))
            setB.push_back(str2.substr(i,2));
    }
    sort(setA.begin(),setA.end());
    sort(setB.begin(),setB.end());
    
    set_union(setA.begin(), setA.end(), setB.begin(), setB.end(), back_inserter(union_result));
    set_intersection(setA.begin(), setA.end(), setB.begin(), setB.end(), back_inserter(inter_result));
    
    if(union_result.size()==0)
        return 65536;
    double similarity = (double)inter_result.size()/(double)union_result.size();
//    cout<<similarity<<endl;
    answer = similarity*65536;
    
    return answer;
}
 
int main(){
    string str1 = "FRANCE";
    string str2 = "french";
    cout<<solution(str1,str2)<<endl;
    
}
 
 
 
 

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17677#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

Comments