코딩문제풀이/프로그래머스

[Python] 매칭 점수

코딩하는 포메라니안 2021. 9. 21. 15:53

1. 문제

 

 

 

2. 풀이 과정

Python 정규 표현식을 이용하여 parsing을 하였다. 여기서 사용된 정규표현식만 살펴보자면 아래와 같다.

import re

#1. findall
text = "hello my id is a1"
#문자로 이루어진 문자 1개이상으로 구성된 것 모두 찾기
test = re.findall(r'[a-zA-Z]+',text)
print(test)
#['hello', 'my', 'id', 'is', 'a']

#2. search
text = '<head> <meta charset="utf-8"> <meta property="og:url" content="https://a.com"/> </head>'
#다음 패턴으로 이루어진 문장 하나 찾기
#[^>]* = >이 아닌 것 0개 이상으로 구성된 것
#[\S]* = 공백이 아닌 것 0개 이상으로 구성된 것
url_str = re.search(r'<meta[^>]*content="https://([\S]*)"/>',text)
print(li3.group()) #일치하는 문장 전체
print(li3.group(1)) #(그룹) a.com을 반환

 

소스코드

class Page(object):
    def __init__(self, i, url, wcount, links):
        self.idx = i
        self.myurl = url
        self.wcount = wcount
        self.outlink = links
        
def parsing(word, page, i):
    import re
    #자신의 URL 주소
    my_url = re.search(r'<meta[^>]*content="https://([\S]*)"/>', page).group(1)
    #단어수
    word = word.lower()
    words = page.lower()
    words = re.findall(r'[a-zA-Z]+', words)
    w_count = words.count(word)
    #외부 링크 URL
    links = re.findall(r'<a href="https://[\S]*">', page)
    out_link = []
    for link in links:
        out_link.append(re.search(r'"https://([\S]*)"', link).group(1))
        
    return Page(i, my_url, w_count, out_link)
        
def solution(word, pages):
    page_objects = []
    for i in range(len(pages)):
        page_objects.append(parsing(word, pages[i], i))
    
    result = []
    for page in page_objects:
        score = page.wcount
        for p in page_objects:
            if page.myurl in p.outlink:
                #매칭 점수 = 기본점수(word수) + 링크 점수(외부의 word수/외부의 링크수)
                score += p.wcount/len(p.outlink)
        result.append((-score, page.idx))
    
    result.sort()
    return result[0][1]

'코딩문제풀이 > 프로그래머스' 카테고리의 다른 글

[Java] 여행경로  (0) 2022.06.27
[Java] 징검다리*  (0) 2022.06.27
[Python] 길 찾기 게임  (0) 2021.09.11
[Python] 무지의 먹방  (0) 2021.09.10
[Python] 후보키  (0) 2021.09.09