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

HL·2021년 3월 10일
0

프로그래머스

목록 보기
28/44

문제 링크

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

문제 설명

  • word(검색어), pages(페이지 리스트) 주어짐
  • 각 페이지마다 (기본 점수), (외부 링크 수), (링크 점수), (매칭 점수) 존재
  • 기본 점수
    • 검색어 등장 횟수
    • 대소문자 구별 X
  • 외부 링크 수
    • a 태그 개수
  • 링크 점수
    • 해당 페이지로 연결되는 외부 페이지의 (기본 점수 / 외부 링크 수)의 총 합
  • 매칭 점수
    • 기본 점수 + 링크 점수

풀이

  • 딕셔너리 초기화
    • key : 현재 페이지의 주소
    • value : 인덱스, 기본 점수, 외부 링크 리스트, 링크 점수
  • 페이지를 돌면서 (현재 주소), (기본 점수), (외부 링크 리스트) 구하기
    • 기본 점수 deque 이용
  • 외부 링크 리스트를 돌면서 링크 점수 구하기
  • 매칭 점수(기본 점수 + 링크 점수)가 최대인 인덱스 구하기

코드

from collections import deque


def solution(word, pages):
    scores = dict()
    # 기본 점수, 외부 링크 리스트
    for i in range(len(pages)):
        link = get_meta(pages[i])
        scores[link] = [i, 0, 0, 0]
        scores[link][1] = get_count(pages[i], word)
        scores[link][2] = get_a_tags(pages[i])
    # 링크 점수
    for curr in scores:
        for linked in scores[curr][2]:
            if linked in scores:
                scores[linked][3] += scores[curr][1] / len(scores[curr][2])
    # 최대 매칭 점수 인덱스
    answer = 0
    max_score = float('-inf')
    for link in scores:
        if max_score < scores[link][1] + scores[link][3]:
            max_score = scores[link][1] + scores[link][3]
            answer = scores[link][0]
    return answer


def get_meta(page):
    start = page.index('<head>')
    while True:
        meta_start = page.index('<meta', start)
        meta_end = page.index('>', meta_start)
        if page.find('content="', meta_start, meta_end) >= 0:
            s = page.find('content="', meta_start, meta_end) + len('content="')
            e = page.find('"', s)
            return page[s:e]
        start = meta_end + 1


def get_count(page, word):
    count = 0
    page_q = deque(page)
    curr_q = deque()
    while page_q:
        c = page_q.popleft()
        if c.isalpha():
            curr_q.append(c)
        else:
            if ''.join(curr_q).upper() == word.upper():
                count += 1
            curr_q = deque()
    return count


def get_a_tags(page):
    a_tags = []
    start = 0
    while True:
        if page.find('<a href="', start) < 0:
            break
        a_start = page.index('<a href="', start)
        a_end = page.index('</a>', a_start)
        link_start = a_start + len('<a href="')
        link_end = page.index('">', link_start)
        a_tags.append(page[link_start:link_end])
        start = a_end + len('</a>')
    return a_tags
profile
Swift, iOS 앱 개발을 공부하고 있습니다

0개의 댓글