본문 바로가기
Programming/Programmers

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

by 데이터현 2021. 11. 18.

https://programmers.co.kr/learn/courses/30/lessons/42893

 

코딩테스트 연습 - 매칭 점수

매칭 점수 프렌즈 대학교 조교였던 제이지는 허드렛일만 시키는 네오 학과장님의 마수에서 벗어나, 카카오에 입사하게 되었다. 평소에 관심있어하던 검색에 마침 결원이 발생하여, 검색개발팀

programmers.co.kr

고통스러웠다 정규식을 나름 조금씩 해봤다고 생각했는데 전혀 모르는 개념이 많았다.

특히 findall 이랑 search + group 차이를 이번에 깨달았고

\w, \W, \s, \S, + , * [ ] 등 다양한 메타 문자를 배우게 된 계기가 됐다..

 

테스트 케이스가 많이 없으면 확실히 어렵다

 

나의 풀이

import re
from collections import defaultdict
def solution(word, pages):
    # 현재 페이지 URL 주소 구하기 content 뒤에 공백이 아닌것들을 그룹핑
    url = re.compile(r'<meta property="og:url" content="(\S+)"')
    # 단어 구하기 영문 대소문자
    words = re.compile(r'[a-z|A-Z]+')
    # 하이퍼 링크 구하기 a 태그 href 사이의 https로 시작하고 공백 없는것으로 그룹핑
    outer_link = re.compile(r'<a href="(https://[\S]+)"')
    score_dict = defaultdict(list)
    link_score = defaultdict(int)
    page_list = []
    for page in pages:
        m = url.search(page)
        page_url = m.group(1)
        word_list = words.findall(page.lower())
        outer_link_list = outer_link.findall(page)
        # word 리스트에서 단어랑 매치되는 개수
        basic_score = word_list.count(word.lower())

        page_list.append(page_url)
        score_dict[page_url] = [basic_score,len(outer_link_list)]
        for link in outer_link_list:
            link_score[link] += basic_score/len(outer_link_list)
    max_score = -1.0
    max_index = -1
    for idx, page in enumerate(page_list):
        page_score = float(score_dict[page][0]) + float(link_score[page])
        if max_score < page_score:
            max_score = page_score
            max_index = idx
    return max_index

댓글