알고리즘 문제/[프로그래머스]

[프로그래머스] 매칭 점수

latter2005 2021. 3. 27. 03:16

2019 카카오 채용 코딩 테스트 문제입니다.

 

코딩테스트 연습 - 매칭 점수

매칭 점수 프렌즈 대학교 조교였던 제이지는 허드렛일만 시키는 네오 학과장님의 마수에서 벗어나, 카카오에 입사하게 되었다. 평소에 관심있어하던 검색에 마침 결원이 발생하여, 검색개발팀

programmers.co.kr

문제 확인

 

스트링 처리 문제입니다.

 

풀이

 

정규 표현식을 사용하여 푸는 것이 푸는 시간 단축에 도움이 됩니다. c++의 <regex>를 사용해 풀어봅니다.

 

씹어먹는 C++ - <17 - 2. C++ 정규 표현식() 라이브러리 소개>

 

modoocode.com

regex::optimize를 이용하여 성능 개선을 할 수 있습니다.

 

웹사이트 이름 처리 : <meta [^>]*content=\"https://(\\S*)\"[^>]*/>

[^>]* : 어트리뷰트 content가 나오기 이전에 '>'가 나오면 무시합니다.

https://(\\S*)\" : () 캡처를 통해 웹사이트 이름을 받아옵니다.

 

word 기본 점수 처리 : [^a-z](" + word + "[^a-z])+

[^a-z] : word 앞에 다른 알파벳이 오지 않도록 합니다.

(" + word + "[^a-z])+ : 단어 단위로 word를 캡처하며 해당 문자열에서 (문자열 길이 - 1)/(word 길이 + 1)를 통해 다수의 word가 겹쳐서 나온 경우를 처리합니다.

 

링크 점수 처리 : <a[\\s]*href=\"https://(\\S*)\"[\\s]*>

(\\S*) : 링크 주소를 받아와 해당 웹페이지가 기록한 웹페이지에 존재한다면 링크 점수를 반영합니다.

 

코드

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
#include <string>
#include <vector>
#include <map>
#include <regex>
using namespace std;
 
typedef struct page {
    double basic, link;
}page;
 
 
int solution(string word, vector<string> pages) {
    int wlen = word.length(), n = pages.size();
 
    regex re_pname("<meta [^>]*content=\"https://(\\S*)\"[^>]*/>", regex::icase | regex::optimize);
    regex    re_href("<a[\\s]*href=\"https://(\\S*)\"[\\s]*>", regex::icase | regex::optimize);
    regex    re_word("[^a-z](" + word + "[^a-z])+", regex::icase | regex::optimize);
    smatch mch;
 
 
    map<stringint> mp;//주소 : 인덱스
    page pg[20= { 0 };
 
    auto e = sregex_iterator();
    for (int i = 0; i < n; ++i) {
        regex_search(pages[i], mch, re_pname);
        mp[mch[1].str()] = i;
 
        auto s = sregex_iterator(pages[i].begin(), pages[i].end(), re_word);//basic
        while (s != e) {
            pg[i].basic += (s->str().length() - 1/ (wlen + 1);
            ++s;
 
        }
    }
 
    for (int i = 0; i < n; i++) {
        auto s = sregex_iterator(pages[i].begin(), pages[i].end(), re_href);//link
        int dv = distance(s, e);
        while (s != e) {
            auto t = mp.find((*s)[1].str());//링크된 웹사이트가 기록되어 있으면
            if (t != mp.end())
                pg[t->second].link += pg[i].basic / dv;
            ++s;
        }
 
    }
 
    double mx = pg[0].basic + pg[0].link;//최댓값 찾기
    int mx_idx = 0;
    for (int i = 1; i < n; i++) {
        if (pg[i].basic + pg[i].link > mx) {
            mx = pg[i].basic + pg[i].link;
            mx_idx = i;
        }
    }
 
    return mx_idx;
}
 
cs
반응형