[프로그래머스] 매칭 점수 (JAVA)

유존돌돌이·2022년 1월 14일
0

Programmers

목록 보기
144/167
post-thumbnail

문제 설명

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

Code

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;
	}
}

Comment

자기 url을 가져오는 부분에서 원래 https로 시작하는 부분을 가져왔는데, https가 url 앞에도 나올 수 있나보다.
urlPattern을 전체로 해서 찾았다.

0개의 댓글