https://www.welcomekakao.com/learn/courses/30/lessons/42893#qna
이번 문제는, 간단한 구현 문제이다.
문제의 조건을 읽고, 차례로 구현을 한다면 쉽게 풀 수 있다.
하지만, strtok를 사용해서 문제를 풀어야 한다고 생각했다면 틀린 생각이다.
주어지는 pages들이 항상 \n을 사용해서 구분되어 있지 않기 때문이다.
아마 55점이 나왔다면, strtok를 사용해서 문제를 풀었기 때문이다.
이번 문제를 통해서 배울 수 있는 것은, 예제뿐만 아니라 전체 테스트 케이스를 커버할 수 있는 코드를 생각하는 것이 중요하다. 문제의 조건에서, \n을 통해서 HTML 문서를 작성했다고 하지 않았다.
웹 페이지를 순환하며 URL을 모두 기록한다. 외부 링크에 대한 점수 계산은 모든 웹 페이지 URL과 a href의 URL을 수집한 후에 진행해야 한다. 실시간으로 계산을 할 수 없다. 이유는 생각해보면 당연하다.
단어 찾기는, 웹 페이지를 하나씩 처리하면서 진행해도 무관하다.
이 2가지 방식을 베이스로 코드를 작성한다면 쉽게 해결 할 수 있다.
문제 코드(C++)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#include <string>
#include <vector>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
bool cmp(pair<double, double> p1, pair<double, double> p2) {
else
}
string make_lowercase(string s) {
for (int i = 0; i < s.length(); i++) {
if (s.at(i) >= 'A' && s.at(i) <= 'Z') {
s.at(i) += 32;
}
}
return s;
}
int solution(string word, vector<string> pages) {
int answer = 0;
double score[20] = { 0 };
double result[20] = { 0 };
map<string, int> url_map;
set<string> url_v[20];
word = make_lowercase(word);
vector<pair<double, double>> v;
for (int i = 0; i < pages.size(); i++)
{
string meta = "<meta";
string https = "\"https://";
string https_end = "\"";
string a = "<a href=\"";
string a_end = "\"";
// Find URL
size_t found = 0;
while (true) {
found = str.find(meta, found);
if (found == string::npos)
break;
url_map[temp] = i;
}
}
// Find a href
found = 0;
while (true) {
found = str.find(a, found);
if (found == string::npos)
break;
found += a.length();
url_v[i].insert(temp);
}
// Find a word
str = make_lowercase(str);
while (found != string::npos) {
score[i] += 1;
(found + word.length() < str.length() - 1 && str.at(found + word.length()) >= 'a' && str.at(found + word.length()) <= 'z')) {
score[i] -= 1;
}
}
}
// a href scoring
for (int i = 0; i < pages.size(); i++) {
if (url_v[i].size() == 0)
continue;
double temp = score[i] / url_v[i].size();
for (set<string>::iterator it = url_v[i].begin(); it != url_v[i].end(); it++) {
continue;
result[url_map[(*it)]] += temp;
}
}
// Sorting
for (int i = 0; i < pages.size(); i++) {
cout << score[i] + result[i]<< endl;
v.push_back(make_pair(result[i] + score[i], i));
}
sort(v.begin(), v.end(), cmp);
answer = v.at(0).second;
cout << answer << endl;
return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'알고리즘' 카테고리의 다른 글
[2018 KAKAO BLIND RECRUITMENT] 추석 트래픽(C++) (0) | 2020.01.21 |
---|---|
[2019 KAKAO BLIND RECRUITMENT] 블록 게임(C++) (0) | 2020.01.12 |
[2019 KAKAO BLIND RECRUITMENT] 무지의 먹방 라이브(시행착오 포함) (0) | 2020.01.01 |
[2019 KAKAO BLIND RECRUITMENT] 후보키 (0) | 2019.12.30 |
[2020 KAKAO BLIND RECRUITMENT] 블록 이동하기(Java, 간단한 코드, DFS? or BFS?) (2) | 2019.12.26 |