본문 바로가기

Algorithm/프로그래머스

프로그래머스 [1차] 뉴스 클러스터링

반응형

프로그래머스 : [1차] 뉴스 클러스터링

 

프로그래머스

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

programmers.co.kr

 


- 문제

  알파벳을 두개씩 묶어서 차집합과 합집합을 구해서 차집합/합집합을 구하는 문제다.

 


- 풀이

#include <string>
#include <vector>
#include <algorithm>
// #include <iostream>

using namespace std;

int solution(string str1, string str2) {
    int answer = 0, front = 0, back = 0, idx1 = 0, idx2 = 0;
    vector<string> v1, v2;
    v1.reserve(1001);
    v2.reserve(1001);
    for(int i = 1; i < str1.size(); i++){
        string temp;
        if(isalpha(str1[i-1]) && isalpha(str1[i])){
            temp.push_back(tolower(str1[i-1]));
            temp.push_back(tolower(str1[i]));
            v1.push_back(temp);
        }
    }
    for(int i = 1; i < str2.size(); i++){
        string temp;
        if(isalpha(str2[i-1]) && isalpha(str2[i])){
            temp.push_back(tolower(str2[i-1]));
            temp.push_back(tolower(str2[i]));
            v2.push_back(temp);
        }
    }
    sort(v1.begin(), v1.end());
    sort(v2.begin(), v2.end());
    // for(auto i : v1){
    //     cout << i << ' ';
    // }
    // cout << '\n';
    // for(auto i : v2){
    //     cout << i << ' ';
    // }
    while(1){
        if(idx1 >= v1.size() && idx2 >= v2.size()){
            break;
        }
        else if( idx1 == v1.size()){
            back++;
            idx2++;
        }
        else if( idx2 == v2.size()){
            back++;
            idx1++;
        }
        else if(v1[idx1] == v2[idx2]){
            front++;
            back++;
            idx1++;
            idx2++;
        }
        else if(v1[idx1] > v2[idx2]){
            back++;
            idx2++;
        }
        else if (v1[idx1] < v2[idx2]){
            back++;
            idx1++;
        }
        // cout << front <<' ' << back << '\n';
    }
    if(front == 0 && back == 0)
        return 65536;
    // cout << front << ' ' << back;
    answer = (int)((double)front / back * 65536);
    return answer;
}

 

 

먼저 v1이랑 v2는 연속된 두개의 문자가 알파벳이면 이를 추가해주는 방식으로 만든다.

  

이후에 정렬을 시켜서 사전순으로 이를 정렬시키고

 

사전순으로 정렬이 되었으니 더 문자열이 같을때만 차집합의 경우를 +1해주고

나머지에서는 합집합의 경우만 +1해준다.

 

 

 


- 기억할 것!

 이거 차집합과 합집합이 둘 다 0일때만 1이 된다고 문제에 적혀 있었는데, 내가 생각했을때 차집합이 0이어도 1로 쳐야한다고 생각해서 차집합이 0일때도 1로 정답을 내도록 했었다.

 

하지만 5번과 13번 테스트 케이스의 경우에는 차집합이 0 일때도 65536을 출력하게 되면 실패가 뜨게 된다. 왜 이러는 지는 모르겠지만 

 

차집합과 합집합 둘다 0일때만 65536을 출력하게 했더니 맞았다.

반응형