본문 바로가기
Problem Solving

[프로그래머스] L3 매칭점수 / 2019 카카오 블라인드 채용 (Java)

by JYHAN 2021. 1. 4.

카카오

[프로그래머스] L3 셔틀버스 / 2018 카카오 블라인드 채용

[풀이]

 

극한의 파싱을 해냈다면 쉽게 풀 수 있는 문제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import java.util.*;
class Solution {
    class Page {
        Page(int idx, double basic, double score, List<String> links){
            this.idx = idx;
            this.basic = basic;
            this.score = score;
            this.links = links;
        }
        int idx;
        double basic, score;
        List<String> links;
    }
    public int solution(String word, String[] pages) {
        word = word.toUpperCase();
        List<Page> infoList = new ArrayList<Page>();
        Map<String, Integer> indexMap = new HashMap<String, Integer>();
        Map<Integer, Double> scoreMap = new HashMap<Integer, Double>();
        for(int i=0; i<pages.length; i++){
            String page = pages[i].toUpperCase();
            String url = getUrl(page);              // url
            double basic = getBasic(page, word); // 기본점수
            List<String> links = getLink(page);  // 외부 링크
            infoList.add(new Page(i, basic, basic/(double)links.size(), links));
            indexMap.put(url, i);
            scoreMap.put(i, basic);
        }
        
        // A와 연결된 B,C의 점수 계산해서 합산
        for(int i=0; i<infoList.size(); i++){
            List<String> links = infoList.get(i).links;
            double score = infoList.get(i).score;
            for(int j=0; j<links.size(); j++){
                String url = links.get(j);
                if(indexMap.containsKey(url)){
                    int idx = indexMap.get(url);
                    scoreMap.put(idx, scoreMap.get(idx)+score);
                }
            }
        }
        
        //최대 점수의 index 찾기
        double maxValue = Double.MIN_VALUE;
        int maxIdx = 0;
        for(int idx: scoreMap.keySet()){
            if(maxValue < scoreMap.get(idx)){
                maxValue = scoreMap.get(idx);
                maxIdx = idx;
             }
        }
        return maxIdx;
    }
    static String getUrl(String page){
        String pattern = "META PROPERTY=\"OG:URL\" CONTENT=\"";
        int start = page.lastIndexOf(pattern)+pattern.length();
        int end = page.indexOf("\"/>", start);
        return page.substring(start,end);
    }
    static double getBasic(String page, String word){
        int cnt = 0;
        int end= 0;
        while(true){
            int start = page.indexOf(word, end);
            if(start == -1
                break;
            end = start + word.length();
            // 앞에 문자가 포함되어 있으면 단어로 볼 수 없다!!
            if(0 < start && ('A' < page.charAt(start-1&& page.charAt(start-1< 'Z')) 
                continue;
            else if(!('A' < page.charAt(end) && page.charAt(end) < 'Z'))
                cnt++;
        }
        return (double)cnt;
    }
    static List<String> getLink(String page){
        List<String> temp = new ArrayList<String>();
        String pattern = "<A HREF=\"";
        int start = 0, end = 0;
        while(true){
            start = page.indexOf(pattern,end);
            if(start==-1)
                break;
            start += pattern.length();
            end = page.indexOf("\">", start);
            temp.add(page.substring(start,end));
        }
        return temp;
    }
}
cs

댓글