코딩테스트 연습 - 매칭 점수 | 프로그래머스 (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]
'CODING TEST > Programmers' 카테고리의 다른 글
| 파이썬 Python KAKAO_2018 프렌즈 4블록 (0) | 2021.06.15 |
|---|---|
| 프로그래머스 카카오블라인드 1차 뉴스클러스터링 (python) (0) | 2021.06.13 |
| N진수 게임 (Python) (0) | 2021.06.13 |
| 프로그래머스 다단계칫솔판매 (Python) (0) | 2021.06.13 |
| 보석 쇼핑 (0) | 2021.05.28 |