본문 바로가기
Algorithm/Python

[Python] 프로그래머스 - 매칭 점수(정규식)

by 힘팽 2022. 3. 16.

◈ 오류 정정 및 피드백 환영

 

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

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

programmers.co.kr


🔎문제 분석

기본 점수를 계산하기 위해서는 검색어를 단어 단위로 탐색해야 하는데 이는 정규식으로 접근하면 된다.

re.findall(f'[a-zA-Z]+', 'abaa baba')
# ['abaa', 'baba']

re.findall(f'[a-zA-Z]+', 'aba@aba 1aba')
# ['aba', 'aba', 'aba']

구분한 단어와 검색어를 대문자로 통일한 뒤에 서로 일치하는지 비교하면 된다.

base = len(list(filter(lambda x: x.upper()==word.upper(), re.findall(f'[a-zA-Z]+', page))))

외부링크 태그는 a href로 시작하므로 이를 활용해 인덱싱하고 https:// 이후 부분만 파싱한다.

def get_rink(x):
    return x.split("https://")[1].split("\"")[0]
   
href = list(map(lambda x: get_rink(x), page.split('a href')[1:]))

웹페이지의 url 주소는 다음과 같은 특정 양식을 따르기 때문에 마찬가지로 정규식으로 접근하면 된다.

name = re.search('<meta property="og:url" content="(\S+)"\/>', page).group(1)

모든 웹페이지에 대해 위와 같은 방식으로 기본점수와 외부링크 개수를 계산하고 이를 딕셔너리 형태로 저장한다.

그리고 이 딕셔너리를 활용해 매칭점수를 계산하면 된다.

🤦‍♀️유의 사항

※ 테스트케이스 9번

웹페이지의 url 주소를 찾을 때 다음과 같이 단순하게 태그의 순서 기준으로 찾으면 안 된다.

name = page.split("\n")[3]

 

※ 테스트케이스 10번

외부링크를 찾을 때 다음과 같이 단순하게 href로만 찾으면 안 된다.

href = list(map(lambda x: get_rink(x), page.split('href')[1:]))

import re
def get_rink(x):
    return x.split("https://")[1].split("\"")[0]

def solution(word, pages):
    dic = {}
    for page in pages:
        base = len(list(filter(lambda x: x.upper()==word.upper(), re.findall(f'[a-zA-Z]+', page))))
        href = list(map(lambda x: get_rink(x), page.split('a href')[1:])) 
        name = re.search('<meta property="og:url" content="(\S+)"\/>', page).group(1)
        dic[get_rink(name)] = [base, href]
  
    mx = answer = 0
    for idx, page in enumerate(dic.keys()):
        link = 0
        for v in dic.values():
            if page in v[1]:
                link += v[0]/len(v[1])
        match = link+dic[page][0]
        if match > mx:
            mx = match
            answer = idx
    return answer

댓글