본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스 뉴스 클러스터링, 2018 카카오] c++ (풀이 및 코드)

by 말린밴댕이_공부 2023. 5. 15.
반응형

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/17677

 

프로그래머스

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

programmers.co.kr

 

문제

 코드 및 풀이

/*
대문자와 소문자의 차이는 무시한다 -> 올 소문자로

문자가 아니라면 문자 두개의 쌍은 취급하지 않음 (공백 포함)
근데 지우면 되는게 아님 그냥 취급을 안하는거지
체크를 할때 만약 소문자가 아니라면 -> 없앤다. 이런 느낌으로
map에다가 있다면 넣고 아니라면 지우고 이러면 되지 않을까?

*/

라는 생각으로 진행을 하였습니다.

맵을 사용했는데 처음 문자열을 비교할때는 <생성된 문자열, 2> 를 insert하였습니다.

 

str2에 대해서 돌고 있을때는 맵에 없다면 <생성된 문자열, 1>을 insert

맵에 있을경우 더 클 수 도 있기 때문에 그에 대해서 교집합 갯수를 늘려줄지 합집합 갯수를 늘려줄지에 대한 조건 처리를 진행하였습니다. 

 

#include <string>
#include <iostream>
#include <map>
#include <cctype>

using namespace std;

string spellConvert(string s); //대소문자 구분이 없으니 일단 소문자로 다 변환


int solution(string str1, string str2) {
    int interSize = 0; // 교집합
    int unionSize = 0; // 합집합
    string tmp ="";
    map<string, int> m;
   
    str1 = spellConvert(str1);
    str2 = spellConvert(str2);
   
    for(int i = 0 ;i < str1.length() - 1;i++){
        if(isalpha(str1[i]) != 0 && isalpha(str1[i + 1]) != 0){
            tmp = str1[i];
            tmp +=str1[i+ 1];
            if(m.find(tmp) == m.end()){
                m.insert(make_pair(tmp,2));
                unionSize++;
            }
            else{
                m[tmp]++;
                unionSize++;
            }
        }
    }
   
    //여기 map에선 비교대상이기 때문에 만약에 같다면 interSize++ (교집합 갯수)
    //다르다면 unionSize++을 진행함
    for(int i = 0 ;i < str2.length() - 1;i++){
        if(isalpha(str2[i]) != 0 && isalpha(str2[i + 1]) != 0){
            tmp = str2[i];
            tmp +=str2[i+ 1];
            if(m.find(tmp) == m.end()){
                m.insert(make_pair(tmp,1));
                unionSize++;
            }else{
                if(m[tmp] >= 2){
                    interSize++;
                    m[tmp] --;
                }else{
                    unionSize++;
                }
            }
        }
    }
   
    if(unionSize == 0)
        return 65536;
    double size = (double) interSize / (double) unionSize;
    return size * 65536;
}

string spellConvert(string s){
    for(int i =0; i < s.length();i++){
        s[i] = tolower(s[i]);
    }
    return s;
}

 

반응형

댓글