[프로그래머스] L3 셔틀버스 / 2018 카카오 블라인드 채용
[풀이]
극한의 파싱을 해냈다면 쉽게 풀 수 있는 문제입니다.
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
|
import java.util.*;
class Solution {
class Page {
Page(int idx, double basic, double score, List<String> links){
this.idx = idx;
this.basic = basic;
this.score = score;
this.links = links;
}
int idx;
double basic, score;
List<String> links;
}
public int solution(String word, String[] pages) {
word = word.toUpperCase();
List<Page> infoList = new ArrayList<Page>();
Map<String, Integer> indexMap = new HashMap<String, Integer>();
Map<Integer, Double> scoreMap = new HashMap<Integer, Double>();
for(int i=0; i<pages.length; i++){
String page = pages[i].toUpperCase();
String url = getUrl(page); // url
double basic = getBasic(page, word); // 기본점수
List<String> links = getLink(page); // 외부 링크
infoList.add(new Page(i, basic, basic/(double)links.size(), links));
indexMap.put(url, i);
scoreMap.put(i, basic);
}
// A와 연결된 B,C의 점수 계산해서 합산
for(int i=0; i<infoList.size(); i++){
List<String> links = infoList.get(i).links;
double score = infoList.get(i).score;
for(int j=0; j<links.size(); j++){
String url = links.get(j);
if(indexMap.containsKey(url)){
int idx = indexMap.get(url);
scoreMap.put(idx, scoreMap.get(idx)+score);
}
}
}
//최대 점수의 index 찾기
double maxValue = Double.MIN_VALUE;
int maxIdx = 0;
for(int idx: scoreMap.keySet()){
if(maxValue < scoreMap.get(idx)){
maxValue = scoreMap.get(idx);
maxIdx = idx;
}
}
return maxIdx;
}
static String getUrl(String page){
String pattern = "META PROPERTY=\"OG:URL\" CONTENT=\"";
int start = page.lastIndexOf(pattern)+pattern.length();
int end = page.indexOf("\"/>", start);
return page.substring(start,end);
}
static double getBasic(String page, String word){
int cnt = 0;
int end= 0;
while(true){
int start = page.indexOf(word, end);
if(start == -1)
break;
end = start + word.length();
// 앞에 문자가 포함되어 있으면 단어로 볼 수 없다!!
if(0 < start && ('A' < page.charAt(start-1) && page.charAt(start-1) < 'Z'))
continue;
else if(!('A' < page.charAt(end) && page.charAt(end) < 'Z'))
cnt++;
}
return (double)cnt;
}
static List<String> getLink(String page){
List<String> temp = new ArrayList<String>();
String pattern = "<A HREF=\"";
int start = 0, end = 0;
while(true){
start = page.indexOf(pattern,end);
if(start==-1)
break;
start += pattern.length();
end = page.indexOf("\">", start);
temp.add(page.substring(start,end));
}
return temp;
}
}
|
cs |
'Problem Solving' 카테고리의 다른 글
[백준/BOJ] 팰린드롬 만들기 (Java) (0) | 2021.01.04 |
---|---|
[프로그래머스] L3 가장 먼 노드 (Java) (0) | 2021.01.04 |
[프로그래머스] L3 보석 쇼핑 / 2020 카카오 인턴십 (Java) (0) | 2021.01.04 |
[프로그래머스] L3 이중우선순위큐 (0) | 2021.01.03 |
[LeetCode] Word Search (Medium) (1) | 2021.01.03 |
댓글