티스토리 뷰

문제 링크

STL 맵을 이용하여 해결했다.

일단 두개의 문자열을 SUB문자열로 나눈 후에 각각 맵에 저장한다.

그 후에 첫번째 맵을 돌면서 교집합을 찾는 작업을 수행한다. 해당 하는 문자열이 두번째 맵에 있는지 확인하여 둘다 존재한다면 두개 중 최소값을 누산한다. 합집합은 둘 중 최대값을 누산한다.

그 후에 주어진 공식을 이용하여 값을 구하고 리턴하면 된다.

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

map <string,int> m1;
map <string,int> m2;

string Upper(string a){
    string ret;
    for (int i=0;i<a.size();i++){
        ret += toupper(a[i]);
    }
    
    return ret;
}

int solution(string str1, string str2) {
    int answer = 0;
    
    str1 = Upper(str1);
    str2 = Upper(str2);
    
    int f=0;
    int s=0;
    double res=0;
    
    for (int i=0;i<str1.size()-1;i++){
        if (!isalpha(str1[i]) || !isalpha(str1[i+1])) continue;
        string temp;
        temp += str1[i];
        temp += str1[i+1];
        m1[temp]++;
    }
    
        for (int i=0;i<str2.size()-1;i++){
        if (!isalpha(str2[i]) || !isalpha(str2[i+1])) continue;
        string temp;
        temp += str2[i];
        temp += str2[i+1];
        m2[temp]++;
    }
    
    for (auto cur : m1){
        string temp = cur.first;
        if (m2.find(temp) != m2.end()){
           f += min(m1[temp],m2[temp]);
           s += max(m1[temp],m2[temp]);
            
           m2[temp] = 0;
        }else
            s += cur.second;
    }
    
    for (auto cur : m2){
        s += cur.second;
    }
    
    if (f == 0 && s == 0) res=1;
    else res = (double)f/s;
    
    cout<<f<<" "<<s<<" "<<res;
    
    answer = res * 65536;
    
    
    return answer;
}

'알고리즘 풀이' 카테고리의 다른 글

BOJ : 12562 친구비  (0) 2021.01.24
BOJ : 2517 달리기  (0) 2021.01.13
BOJ : 14921 용액 합성하기  (0) 2021.01.09
BOJ : 1644 소수의 연속합  (0) 2021.01.04
BOJ : 1806 부분합  (0) 2021.01.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함