본문 바로가기
Coding Test/Programmers

[Programmers] (2018 KAKAO BLIND RECRUITMENT) Lv 2. [1차] 뉴스 클러스터링

by song.ift 2023. 6. 16.

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>
#include <map>
 
#define MULTIPLE 65536
using namespace std;
 
 
int Min(int A, int B) { return A < B ? A : B; }
int Max(int A, int B) { return A > B ? A : B; }
 
int Check_State(char C)
{
    if ('A' <= C && C <= 'Z') return 2;
    if ('a' <= C && C <= 'z') return 1;
    return 0;
}
 
char Invert(char C)
{
    C = C - 'A';
    C = C + 'a';
    return C;
}
 
int solution(string str1, string str2) 
{
    vector<string> Total_Str;
    map<string, int> A, B;
 
    /* str1에 대해서 "올바른 문자열" 추출하기. */
    for (int i = 0; i < str1.length() - 1; i++)
    {
        char First = str1[i];
        char Second = str1[i + 1];
        int First_State = Check_State(First);
        int Second_State = Check_State(Second);
        
        if (First_State == 0 || Second_State == 0) continue;
        if (First_State == 2) First = Invert(First);
        if (Second_State == 2) Second = Invert(Second);
        
        string Temp = "";
        Temp = Temp + First;
        Temp = Temp + Second;
        /* 전체 문자열을 관리할 때는, 중복되지 않게 삽입해야한다. */
        /* 중복을 확인하기 위해서는 map에 이미 값이 있는지 확인하면 된다. */
        if (A[Temp] == 0) Total_Str.push_back(Temp);
        A[Temp]++;
    }
 
    /* str2에 대해서 "올바른 문자열" 추출하기. */
    for (int i = 0; i < str2.length() - 1; i++)
    {
        char First = str2[i];
        char Second = str2[i + 1];
        int First_State = Check_State(First);
        int Second_State = Check_State(Second);
 
        if (First_State == 0 || Second_State == 0) continue;
        if (First_State == 2) First = Invert(First);
        if (Second_State == 2) Second = Invert(Second);
 
        string Temp = "";
        Temp = Temp + First;
        Temp = Temp + Second;
        /* str2에서 발생한 문자열도, 전체 문자열을 관리하는 vector에 값을 삽입해야함. */
        /* 물론, 중복이 되지 않게 하기 위해서, map을 이용해서 판단. */
        if (A[Temp] == 0 && B[Temp] == 0) Total_Str.push_back(Temp);
        B[Temp]++;
    }
    
    if (Total_Str.size() == 0) return MULTIPLE;
 
    int Intersection, Union;
    Intersection = Union = 0;
 
    for(int i = 0; i < Total_Str.size(); i++)
    { 
        /* 교집합은, 두 집합 중 더 적은 갯수. */
        /* 합집합은, 두 집합 중 더 큰 갯수. */
        string Str = Total_Str[i];
        Intersection = Intersection + Min(A[Str], B[Str]);
        Union = Union + Max(A[Str], B[Str]);
    }
    
    double answer = (double)Intersection / Union;
    answer = answer * MULTIPLE;
    return (int)answer;
}

GitHub : https://github.com/developeSHG/Algorithm-Baekjoon_Programmers/blob/b88304d6343cf515122b4d72e441f628e536a668/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/lv2/17677.%E2%80%85%EF%BC%BB1%EC%B0%A8%EF%BC%BD%E2%80%85%EB%89%B4%EC%8A%A4%E2%80%85%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81/%EF%BC%BB1%EC%B0%A8%EF%BC%BD%E2%80%85%EB%89%B4%EC%8A%A4%E2%80%85%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81.cpp

 

GitHub - developeSHG/Algorithm-Baekjoon_Programmers: 백준 and 프로그래머스 소스코드

백준 and 프로그래머스 소스코드. Contribute to developeSHG/Algorithm-Baekjoon_Programmers development by creating an account on GitHub.

github.com

 

댓글