알고리즘/알고리즘 공부(python)

프로그래머스_매칭점수(실패)

소소한필통 2022. 5. 3. 01:49

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

 

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

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

programmers.co.kr

 

문제는 카카오에서 출제 했던 매칭점수이다. 난이도는 3이다.

 

이 문제는 어떻게 url을 받아올지가 가장 중요하다.

 

나의 방법은 띄어쓰기를 기준으로 split으로 나누고 head, body 두개로 나누어서 

head에서는 나의 url을 찾고 body에서는 링크되어있는 url과 내용을 찾는다.

이 url을 찾았던 것을 바탕으로 점수를 계산하면 된다.

 

그리고 basis_score을 구할 때 소문자, 대문자를 통일해 줘야 하기 때문에 lower() 함수를 썼다.

 

이유는 모르겠지만 실패했다. index, 정답오류가 발생했다.ㅜㅜ

 

def solution(word, pages):
    word = word.lower()
    url = []  # 자신의 url이 들어갈 리스트
    page = []  # 각 페이지에 split된 값들이 들어갈 list
    basis_score = [0] * len(pages)
    out_link_index = [[] for _ in range(len(pages))]  # 링크점수를 매기기 위한 link_index
    matching_score = []  # 매칭점수
    link_score = [0] * len(pages)
    for i in range(len(pages)):
        # 띄어쓰기로 분할하기
        page.append(list(pages[i].split('\n')))
        # 현재 페이지 나타내기
        now_page = page[i]
        # 시간 단축을 위해서 head 와 body부분을 나누는데 head부분
        head = now_page[now_page.index('<head>') + 1: now_page.index('</head>  ')]
        # 자신의 url을 찾고 url에 append
        for j in range(len(head)):
            if '<meta property="og:url" content="' in head[j]:
                now_url = head[j]
                now_url = now_url[now_url.index('<meta property="og:url" content="'):]
                now_url = now_url[now_url.index('https'):]
                now_url = now_url[:now_url.index('"')]
                url.append(now_url)
                break
    for i in range(len(pages)):
        now_page = page[i]
        # body부분
        body = now_page[now_page.index('<body>') + 1: now_page.index('</body>')]
        score = 0
        for j in range(len(body)):
            # 소문자로 다 바꾸기
            now_text = body[j].lower()
            # link 찾기
            if '<a href=' in now_text:
                out_link = now_text[now_text.index('<a href="') + 9:now_text.index('">')]

                # link의 index 찾기
                if out_link in url:
                    out_link_index[i].append(url.index(out_link))
                else:
                    out_link_index[i].append(-1)

                # link의 나머지 부분도 body의 글이 될수 있음
                # 이건 a tage의 앞부분
                find_word = ''
                for w in now_text[:now_text.index('<a href="')]:
                    if w.isalpha():
                        find_word += w
                    else:
                        if find_word == word:
                            score += 1
                        find_word = ''
                if find_word == word:
                    score += 1

                # 이건 a tage의 뒷부분
                find_word = ''
                for w in now_text[now_text.index('</a>') + 4:]:
                    if w.isalpha():
                        find_word += w
                    else:
                        if find_word == word:
                            score += 1
                        find_word = ''
                if find_word == word:
                    score += 1
            # 여기는 그 이외의 부분에서 word 찾기
            else:
                find_word = ''
                for w in now_text:
                    if w.isalpha():
                        find_word += w
                    else:
                        if find_word == word:
                            score += 1
                        find_word = ''
                if find_word == word:
                    score += 1
        basis_score[i] += score
    # link_score 계산하기
    for i in range(len(out_link_index)):
        score = basis_score[i] / len(out_link_index[i])
        for j in range(len(out_link_index[i])):
            if out_link_index[i][j] != -1:
                link_score[out_link_index[i][j]] += score

    # match_score 계산하기
    for i in range(len(out_link_index)):
        matching_score.append(basis_score[i] + link_score[i])

    max_index = matching_score.index(max(matching_score))
    return max_index