프렌즈 대학교 조교였던 제이지는 허드렛일만 시키는 네오 학과장님의 마수에서 벗어나, 카카오에 입사하게 되었다.
평소에 관심있어하던 검색에 마침 결원이 발생하여, 검색개발팀에 편입될 수 있었고, 대망의 첫 프로젝트를 맡게 되었다.
그 프로젝트는 검색어에 가장 잘 맞는 웹페이지를 보여주기 위해 아래와 같은 규칙으로 검색어에 대한 웹페이지의 매칭점수를 계산 하는 것이었다.
import java.util.*;
class Solution {
private int[] scores;
private int[] extCnt;
private Map<String, List<Integer>> extUrl;
private Map<Integer, String> url;
public int solution(String word, String[] pages) {
scores = new int[pages.length];
extCnt = new int[pages.length];
extUrl = new HashMap<>();
url = new HashMap<>();
int ret = 0;
double retScore = Long.MIN_VALUE;
word = word.toLowerCase();
for(int i=0 ; i<pages.length ; i++) {
// lowercase
String page = pages[i].toLowerCase();
init(page, word, i);
}
for(int i=0 ; i<pages.length ; i++) {
double score = scores[i];
if(extUrl.containsKey(url.get(i))) {
for(int extIdx : extUrl.get(url.get(i))) {
// 외부 url이 없는 경우는 0나누기 에러날텐데?
score += (double)scores[extIdx]/(double)extCnt[extIdx];
}
}
if(retScore<score) {
retScore = score;
ret = i;
}
}
return ret;
}
public void init(String page, String word, int idx) {
// Get url(실패)
//int urlStart=page.indexOf("https"); // https가 url 앞에 있을 수도 있나보다.
//int urlEnd=page.indexOf("\"",urlStart);
//String curUrl = page.substring(urlStart, urlEnd);
// Get url
String urlPattern = "<meta property=\"og:url\" content=\"";
int urlStart = page.indexOf(urlPattern) + urlPattern.length();
int urlEnd = page.indexOf("\"/>", urlStart);
String curUrl = page.substring(urlStart, urlEnd);
url.put(idx, curUrl);
// Set External url
String[] aHerf = page.split("<a href=\"");
for(int a=1 ; a<aHerf.length ; a++) {
// 연결된 url
String linkedUrl = aHerf[a].substring(0, aHerf[a].indexOf("\""));
// 연결 url에 현재 url 추가
if(!extUrl.containsKey(linkedUrl)) extUrl.put(linkedUrl, new ArrayList<>());
extUrl.get(linkedUrl).add(idx);
}
// Set Extrenal url Count
extCnt[idx] = aHerf.length-1;
// Set score
page = page.replaceAll("[^a-zA-Z]", " ");
scores[idx] = countWord(page.split(" "), word);
return;
}
public int countWord(String[] words, String word) {
int cnt=0;
for(String w : words) {
if(w.equals(word)) cnt++;
}
return cnt;
}
}
자기 url을 가져오는 부분에서 원래 https로 시작하는 부분을 가져왔는데, https가 url 앞에도 나올 수 있나보다.
urlPattern을 전체로 해서 찾았다.