🖇️ 문제 링크
코딩테스트 연습 - 매칭 점수
프렌즈 대학교 조교였던 제이지는 허드렛일만 시키는 네오 학과장님의 마수에서 벗어나, 카카오에 입사하게 되었다. 평소에 관심있어하던 검색에 마침 결원이 발생하여, 검색개발팀에 편입될 수 있었고, 대망의 첫 프로젝트를 맡게 되었다. 그 프로젝트는 검색어에 가장 잘 맞는 웹페이지를 보여주기 위해 아래와 같은 규칙으로 검색어에 대한 웹페이지의 매칭점수를 계산 하는 것이었다.


📝 문제 분석
html 페이지에서 웹페이지의 URL과 외부 링크의 URL을 정규식 매칭을 이용해 찾아낸다.
외부 링크의 개수를 통해 기본 점수를 구한다.
웹페이지들을 각각 연결 상태를 파악하고, 매칭 점수를 구해서 최대 매칭 점수의 인덱스를 리턴한다.
⌨️ 코드
import java.util.*;
import java.util.regex.*;
class Solution {
public int solution(String word, String[] pages) {
int n = pages.length;
String[] urls = new String[n];
Set<String>[] outlinks = new Set[n];
for (int i = 0; i < n; ++i)
outlinks[i] = new HashSet<String>();
int[] defaultScores = new int[n];
Pattern urlPattern = Pattern.compile("<\\s*meta\\s+property=\"og:url\"\\s+content=\"([^\"]+)\"/>");
Pattern outlinkPattern = Pattern.compile("<\\s*a\\s+href=\"([^\"]+)\">");
for (int i = 0; i < n; ++i) {
String page = pages[i];
Matcher urlMatcher = urlPattern.matcher(page);
if (urlMatcher.find())
urls[i] = urlMatcher.group(1);
Matcher outlinkMatcher = outlinkPattern.matcher(page);
while (outlinkMatcher.find())
outlinks[i].add(outlinkMatcher.group(1));
String[] words = page.split("[^[a-zA-Z]]");
for (String candidate : words) {
if (candidate.equalsIgnoreCase(word))
defaultScores[i]++;
}
}
double[] scores = new double[n];
for (int i = 0; i < n; ++i) {
scores[i] += defaultScores[i];
for (int j = 0; j < n; ++j) {
if (i != j && outlinks[j].contains(urls[i]))
scores[i] += (double) defaultScores[j] / outlinks[j].size();
}
}
int answer = 0;
double maxScore = 0.0;
for (int i = 0; i < n; ++i) {
if (Double.compare(scores[i], maxScore) > 0) {
maxScore = scores[i];
answer = i;
}
}
return answer;
}
}
Uploaded by Notion2Tistory v1.1.0