본문 바로가기
프로그래머스

[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - [1차] 뉴스 클러스터링, C++

by 황인태(intaehwang) 2020. 1. 4.
반응형

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

 

코딩테스트 연습 - [1차] 뉴스 클러스터링 | 프로그래머스

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브는 사용자들이 편리하게 다양한 뉴스를 찾아볼 수 있도록 문제점을 개선하는 업무를 맡게 되었다. 개발의 방향을 잡기 위해 튜브는 우선 최근 화제가 되고 있는 카카오 신입 개발자 공채 관련 기사를 검색해보았다. 카카오 첫 공채..'블라인드' 방식 채용 카카오, 합병 후 첫

programmers.co.kr

 본 문제는 '2018 KAKAO BLIND RECRUITMENT'로 kakao Tech에 의하면 "정답률 41.84%," 라고 한다. 난이도는 중으로 구분되어 있다. 다중집합의 교집합과 합집합을 구하는 문제다. 이번 문제는 "특수문자가 포함된 원소는 버리고, 대소문자를 구분하지 않고 비교한다."는 조건 때문에 코드가 좀 긴 편이다. 함수를 이용하여 중복된 코드를 줄일 수 있지만, 귀찮아서 수정하지 않았다. 참고로 교집합의 개수를 구할 때, 중복된 원소를 확인 후 변환하지 않고 2중 반복문을 하여 조금 헤맨 문제다.

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <string>
#include <vector>
#include <iostream>
 
using namespace std;
 
int solution(string str1, string str2) {
    int answer = 0;
    vector<string> v1;
    vector<string> v2;
    for (int i = 0; i < str1.size(); i++) {
        // 2개의 문자열 씩 비교
        string tmp = str1.substr(i, 2);
        string temp = "";
        // 첫 번째, 두 번째 문자 알파벳 확인 이 때, 특수문자 원소 제거
        if ((tmp[0]-'a' >= 0 && tmp[0]-'a' <= 25|| (tmp[0]-'A' >= 0 && tmp[0]-'A' <= 25)) {
            if ((tmp[1]-'a' >= 0 && tmp[1]-'a' <= 25|| (tmp[1]-'A' >= 0 && tmp[1]-'A' <= 25)) {
                // 첫 번째, 두번째 문자 소문자로 변환
                if ((tmp[0]-'a' >= 0 && tmp[0]-'a' <= 25&& (tmp[1]-'a' >= 0 && tmp[1]-'a' <= 25)) { 
                    v1.push_back(tmp);
                }
                else if ((tmp[0]-'a' >= 0 && tmp[0]-'a' <= 25&& (tmp[1]-'A' >= 0 && tmp[1]-'A' <= 25)) {
                    temp += tmp[0];
                    temp += tmp[1]-'A'+'a';
                    v1.push_back(temp);
                }
                else if ((tmp[0]-'A' >= 0 && tmp[0]-'A' <= 25&& (tmp[1]-'a' >= 0 && tmp[1]-'a' <= 25)) {
                    temp += tmp[0]-'A'+'a';
                    temp += tmp[1];
                    v1.push_back(temp);
                }
                else if ((tmp[0]-'A' >= 0 && tmp[0]-'A' <= 25&& (tmp[1]-'A' >= 0 && tmp[1]-'A' <= 25)) {
                    temp += tmp[0]-'A'+'a';
                    temp += tmp[1]-'A'+'a';
                    v1.push_back(temp);
                }
            }
        }
    }
    for (int i = 0; i < str2.size(); i++) {
        string tmp = str2.substr(i, 2);
        string temp = "";
        if ((tmp[0]-'a' >= 0 && tmp[0]-'a' <= 25|| (tmp[0]-'A' >= 0 && tmp[0]-'A' <= 25)) {
            if ((tmp[1]-'a' >= 0 && tmp[1]-'a' <= 25|| (tmp[1]-'A' >= 0 && tmp[1]-'A' <= 25)) {
                if ((tmp[0]-'a' >= 0 && tmp[0]-'a' <= 25&& (tmp[1]-'a' >= 0 && tmp[1]-'a' <= 25)) { 
                    v2.push_back(tmp);
                }
                else if ((tmp[0]-'a' >= 0 && tmp[0]-'a' <= 25&& (tmp[1]-'A' >= 0 && tmp[1]-'A' <= 25)) {
                    temp += tmp[0];
                    temp += (tmp[1]-'A'+'a');
                    v2.push_back(temp);
                }
                else if ((tmp[0]-'A' >= 0 && tmp[0]-'A' <= 25&& (tmp[1]-'a' >= 0 && tmp[1]-'a' <= 25)) {
                    temp += (tmp[0]-'A'+'a');
                    temp += tmp[1];
                    v2.push_back(temp);
                }
                else if ((tmp[0]-'A' >= 0 && tmp[0]-'A' <= 25&& (tmp[1]-'A' >= 0 && tmp[1]-'A' <= 25)) {
                    temp += (tmp[0]-'A'+'a');
                    temp += (tmp[1]-'A'+'a');
                    v2.push_back(temp);
                }
            }
        }
    }
    float cal = 0;
    // 교집합 개수 cnt
    for (int i = 0; i < v1.size(); i++) {
        for (int j = 0; j < v2.size(); j++) {
            if (v1[i] == v2[j]) {
                cal += 1;
                v2[j] = 'X'// 교집합의 원소일 때, 값 변경
                break;
            }
        }
    }
    float ans = 1;
    if (v1.size()+v2.size()-cal == 0 && cal == 0) ans = 1;
    else {
        ans = cal / (v1.size()+v2.size()-cal);
    }
    return answer = ans * 65536;
}
cs

반응형
Buy me a coffeeBuy me a coffee

댓글