[PRO] 매칭 점수

천호영·2022년 9월 3일
0

알고리즘

목록 보기
52/100
post-thumbnail

50분 정도 소요되어서 제출 후 정답처리된 코드이다.

전체적으로 문자열을 잘 다뤄야 하는데, 정규표현식이 유용하게 쓰였다.
정규표현식 구현 방법은 검색을 통해 참고했는데, 평소에 익혀둘 필요가 있을 것 같다.

import re
from collections import defaultdict

def solution(word, pages):
    answer = 0
    
    # 기본 점수 구하기
    basic_scores = []
    for page in pages:
        splited_page = re.split('[^a-zA-Z]', page.lower()) # 단어 단위로 세어야 함
        basic_score = splited_page.count(word.lower())
        basic_scores.append(basic_score)
    
    url_index_math_dict = dict()
    # 이름 인덱스 매칭 dict 설정
    for i, page in enumerate(pages):
        find_str = '<meta property="og:url" content='
        start_idx = page.find(find_str)
        end_idx = start_idx + page[start_idx:].find('>')
        page_url = page[start_idx+len(find_str): end_idx-1]
        url_index_math_dict[page_url] = i
    
    
    linked_dict = defaultdict(list)
    link_count = [0] * len(pages)
    # 외부 링크 dict 설정
    for i, page in enumerate(pages):
        start_idxs = []
        find_str = "<a href="
        start_idxs = [m.start() for m in re.finditer(find_str, page)]
        link_count[i] += len(start_idxs)
        for start_idx in start_idxs:
            end_idx = start_idx + page[start_idx:].find('>')
            linking_url = page[start_idx+len(find_str): end_idx]
            
            if linking_url in url_index_math_dict:
                linked_dict[url_index_math_dict[linking_url]].append(i)
    
    # 점수 계산
    scores = []
    for i in range(len(pages)):
        score = basic_scores[i]
        for linking_idx in linked_dict[i]:
            score += basic_scores[linking_idx]/link_count[linking_idx]
        scores.append((score, i))
    scores.sort(key = lambda x: (-x[0],x[1]))
    
    return scores[0][1]
profile
성장!

0개의 댓글