코딩테스트 연습 - 매칭 점수 | 프로그래머스 (programmers.co.kr)

어우.... re모듈 진짜 끔찍하게 사용했다...

이건 .. 문제 설명을 여기에 붙이는게 무의미한 수준이다.

노가다 끝판왕이라고 생각하면 될거같고... re모듈에 친숙하다면 노가다가 조금 더 쉬웠을지 않을까..싶다

굳이 문제에 대한 풀이를 설명하기에 이 문제를 푸는 로직에 대해 설명하는게 최선일거같다.

1. (기본점수 계산) pages들에 대하여 각 page마다 자신의 이름, 기본점수, 외부링크를 찾아서 딕셔너리화한다
딕셔너리는 { 페이지이름 : [인덱스, 기본점수, 0 (외부점수), [외부링크List]] 의 형태로 구성했다.

2. (외부점수 계산) 딕셔너리의 페이지이름마다 돌며, 자신이 가진 외부링크에 기본점수 / 외부링크수 를 더해서 해당 외부링크페이지의 외부링크점수를 넣어준다

3. 각 페이지의 [ 인덱스, 기본+외부점수 ] 를 원소로 하는 answer list생성

4. answer list를 점수값 기준 오름차순 소팅 + 인덱스 겹치면 더 낮은인덱스가 뒤로오도록 소팅

5. 마지막꺼 return

def getPage(page, word):
    basic_score = 0
    tmp = re.findall(r'<meta property.*?>', page) ## 자기 링크
    mypagename = re.findall(r'https://.*?"',tmp[0])[0].split('"')[0]

    # print('My Page name :',mypagename) ## My Page Name

    external =  re.findall(r'<a href=.*?</a>', page) ## 외부링크수
    extlist=[]
    for ext in external:
        tmp = ext.split('"')[1]
        extlist.append(tmp)
    # print("External Page list :",extlist)

    tokens = re.sub(pattern="[0-9-=+,#/\?:^$.@*\"※~&%ㆍ!』\\‘|\(\)\[\]\<\>`\'…》]", repl=' ',string=page).split()
    for token in tokens:
        if token == word.lower(): basic_score +=1
    # print(basic_score)
    return mypagename, extlist, basic_score

def solution(word , pages):
    # answer = 0
    rank = {}
    for i,page in enumerate(pages):
        myp, extlist, bs  = getPage(page.lower(), word)
        rank[myp] = [i,bs, 0 ,extlist]
    # print(rank)
    for page in rank:
        # print(page,'외부점수주기')
        for ext in rank[page][3]:
            # print(ext, rank[ext])
            if rank.get(ext):
                rank[ext][2] += rank[page][1] / len(rank[page][3]) # basicScore / link 개수
    answer=[]
    for page in rank:
        answer.append([rank[page][1]+rank[page][2], rank[page][0]])
    return sorted(answer, key=(lambda x: (x[0],-x[1])))[-1][-1]

 

+ Recent posts