매칭 점수 : https://programmers.co.kr/learn/courses/30/lessons/42893#
문제자체는 어렵지 않지만 정규식을 모르면 하드코딩을 해야하는 문제.
문자열에서 특정 패턴의 문자열을 찾기위해 util.Pattern 라이브러리를 사용하였다.
사용한 Pattern, Matcher 함수
사용한 정규식
문제 풀이순서는 아래와 같다.
import java.util.regex.*;
import java.util.*;
class Solution {
HashMap<String,Integer> urlMap;
URL[] urls;
public int solution(String word, String[] pages) {
urlMap = new HashMap<>();
urls = new URL[pages.length];
word = word.toLowerCase();
for(int i=0;i<pages.length;i++){
pages[i] = pages[i].toLowerCase();
}
for(int i=0;i<pages.length;i++){
//웹페이지 url 패턴(content= 이후의 url은 띄어쓰기가 없는 문자열을 가지게 되므로 \\S+)
Pattern urlPattern = Pattern.compile("<meta property=\"og:url\" content=\\S+/>");
//외부 링크 url 패턴(마찬가지로 href= 이후의 url은 띄어쓰기가 없는 문자열을 가진다)
Pattern refUrlPattern = Pattern.compile("<a href=\\S+>");
//body안의 문자열을 분리한 뒤 word를 가지는 패턴(문자가 서로 붙어있다면 같은 word로 판단하지 않겠다는 조건이 있었음)
Pattern bodyPattern = Pattern.compile("\\b"+word+"\\b");
Matcher urlMatcher = urlPattern.matcher(pages[i]);
Matcher refUrlMatcher = refUrlPattern.matcher(pages[i]);
//숫자를 띄어쓰기로 변경함으로써 숫자로 붙어있는 word를 구분해주기 위함
Matcher bodyMatcher = bodyPattern.matcher(pages[i].split("<body>")[1].split("</body>")[0].replaceAll("[0-9]", " "));
int score = 0;
List<String> refUrlList = new ArrayList<>();
//웹 페이지 url을 찾았다면 map에 url과 index저장
if(urlMatcher.find()){
String url = urlMatcher.group().split("=")[2].split("/>")[0];
urlMap.put(url, i);
}
//매칭된 외부 링크를 모두 list에 저장
while(refUrlMatcher.find()){
String url = refUrlMatcher.group().split(">")[0].split("=")[1];;
refUrlList.add(url);
}
//매칭된 word 개수 카운트
while(bodyMatcher.find()){
score++;
}
//해당 웹페이지 정보 저장
urls[i] = new URL(i, score, refUrlList);
}
//각 URL의 linkscore 계산
for(URL u : urls){
double s = u.score;
int refCount = u.refList.size();
for(String ref : u.refList){
if(urlMap.containsKey(ref)){
urls[urlMap.get(ref)].linkScore += s/refCount;
}
}
}
//최종 linkscore 갱신
for(URL u : urls){
u.setLinkScore();
}
//linkscore기준으로 내림차순
Arrays.sort(urls);
//가장 높은 linkscore의 url의 index를 반환한다.
int answer = urls[0].index;
return answer;
}
class URL implements Comparable<URL> {
int index;
double score;
double linkScore;
List<String> refList;
public URL(int index, int score, List<String> refList){
this.index = index;
this.score = score;
this.refList = refList;
this.linkScore=0;
}
@Override
public int compareTo(URL o){
if(o.linkScore > this.linkScore) return 1;
else if(o.linkScore == this.linkScore) return 0;
else return -1;
}
public void setLinkScore(){
this.linkScore+=this.score;
}
}
}
https://dev-note-97.tistory.com/244