Programmers - 매칭 점수

SJ0000·2022년 6월 30일

문제 링크

문자열 파싱하는 문제이다.
파싱해서 필요한 데이터를 객체로 만드는 것 외에는 어려운 요소는 없다.
Page라는 클래스를 만들고 해당 클래스에 풀이에 필요한 필드를 정의하여 풀었다.

import java.util.*;
import java.util.stream.Collectors;

class Solution {

    public int solution(String word, String[] pages) {

        List<Page> pageList = Arrays.stream(pages)
                .map(html -> new Page(html, word))
                .collect(Collectors.toList());

        for(int i=0;i<pages.length;i++){
            Page a = pageList.get(i);
            for(int j=0;j<pages.length;j++){
                if(i==j)
                    continue;
                Page b = pageList.get(j);
                for(String link : b.externalLinks){
                    if(link.equals(a.url)){
                        a.linkPoint += b.basicPoint/b.externalLinks.size();
                    }
                }
            }
        }
        
        double maxMatchPoint = pageList.stream().mapToDouble(Page::getMatchPoint)
                .max()
                .getAsDouble();

        int answer = 0;
        for(int i=0;i<pageList.size();i++){
            Page p = pageList.get(i);
            if(p.getMatchPoint() == maxMatchPoint){
                answer = i;
                break;
            }
        }

        return answer;
    }

    static class Page{
        String url;
        double basicPoint;
        double linkPoint = 0;
        List<String> externalLinks;

        public Page(String html, String searchWord){
            html = html.toLowerCase();
            searchWord = searchWord.toLowerCase();

            this.url = parseUrl(html);
            this.basicPoint = calculateBasicPoint(html,searchWord);
            this.externalLinks = parseExternalLinks(html);
        }

        public double getMatchPoint(){
            return basicPoint + linkPoint;
        }

        private String parseUrl(String html){
            String tag = "<meta property=\"og:url\" content=";
            int start = html.indexOf(tag) + tag.length();
            int end = html.indexOf("/>",start);
            return html.substring(start+1, end-1);
        }

        private double calculateBasicPoint(String html,String searchWord){
            List<String> words = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for(int i = 0;i<html.length();i++){
                char ch = html.charAt(i);
                if('a' <= ch && ch <= 'z'){
                    sb.append(ch);
                }else{
                    if(sb.length()==0)
                        continue;
                    words.add(sb.toString());
                    sb = new StringBuilder();
                }
            }
            long count = words.stream()
                    .filter(word -> word.equals(searchWord))
                    .count();
            return (double) count;
        }

        private List<String> parseExternalLinks(String html){
            List<String> links = new ArrayList<>();
            String tag = "<a href=";
            int start = 0;
            int end = 0;
            while(true){
                int index = html.indexOf(tag,end);
                if(index == -1)
                    break;
                start = index+tag.length();
                end = html.indexOf(">",start);
                String link = html.substring(start + 1, end - 1);
                links.add(link);
            }
            return links;
        }
    }
}
profile
잘하고싶은사람

0개의 댓글