50분 정도 소요되어서 제출 후 정답처리된 코드이다.
전체적으로 문자열을 잘 다뤄야 하는데, 정규표현식이 유용하게 쓰였다.
정규표현식 구현 방법은 검색을 통해 참고했는데, 평소에 익혀둘 필요가 있을 것 같다.
import re
from collections import defaultdict
def solution(word, pages):
answer = 0
# 기본 점수 구하기
basic_scores = []
for page in pages:
splited_page = re.split('[^a-zA-Z]', page.lower()) # 단어 단위로 세어야 함
basic_score = splited_page.count(word.lower())
basic_scores.append(basic_score)
url_index_math_dict = dict()
# 이름 인덱스 매칭 dict 설정
for i, page in enumerate(pages):
find_str = '<meta property="og:url" content='
start_idx = page.find(find_str)
end_idx = start_idx + page[start_idx:].find('>')
page_url = page[start_idx+len(find_str): end_idx-1]
url_index_math_dict[page_url] = i
linked_dict = defaultdict(list)
link_count = [0] * len(pages)
# 외부 링크 dict 설정
for i, page in enumerate(pages):
start_idxs = []
find_str = "<a href="
start_idxs = [m.start() for m in re.finditer(find_str, page)]
link_count[i] += len(start_idxs)
for start_idx in start_idxs:
end_idx = start_idx + page[start_idx:].find('>')
linking_url = page[start_idx+len(find_str): end_idx]
if linking_url in url_index_math_dict:
linked_dict[url_index_math_dict[linking_url]].append(i)
# 점수 계산
scores = []
for i in range(len(pages)):
score = basic_scores[i]
for linking_idx in linked_dict[i]:
score += basic_scores[linking_idx]/link_count[linking_idx]
scores.append((score, i))
scores.sort(key = lambda x: (-x[0],x[1]))
return scores[0][1]