풀이 과정
- 정규 표현식을 활용하여 meta 태그에서 자기 사이트 주소를 가져온다.(re.findall)
- 정규 표현식을 활용하여 모든 a 태그에서 자기가 링크하고있는 사이트 주소들을 가져온다.(re.findall)
- 이 때, 해당 사이트에 자기가 링크중이라는걸 따로 저장하여 둔다.
- 정규 표현식을 활용하여 기본 점수를 구한다(re.split)
- 각 사이트별로 점수를 구한 뒤, 최댓값인 사이트의 인덱스를 리턴한다. 이때, 여러개라면 순번이 작은걸 리턴해주어야 함.
정규 표현식에서 문제가 있어서 75점에서 막혔었다.
<a href=".*"> 는 75점이 나와서 찾아본 결과 <a href="[^"]*">로 해보니 100점이 나오는데.. url 내에 이상한 테스트 케이스가 존재하는거 같다..
소스 코드
import re
def get_links(page, word, idx, site_index, site_score, site_link_count, site_linked):
page = page.lower()
# 자기 사이트 가져오는 파트
pattern = r'<meta property="og:url" content=".+"/>'
temp = re.findall(pattern, page)
mysite = temp[0][len('<meta property="og:url" content="'):-3]
# 딕셔너리 초기화
site_score[mysite] = 0
site_link_count[mysite] = 0
site_index[mysite] = idx
if site_linked.get(mysite) == None:
site_linked[mysite] = []
# 링크한 사이트들에 자기가 링크중이라고 표시
pattern = r'<a href="[^"]*">'
temp = re.findall(pattern, page)
for t in temp:
site_link_count[mysite] += 1
site = t[9:-2]
if site_linked.get(site) == None:
site_linked[site] = [mysite]
else:
site_linked[site].append(mysite)
# 기본점수 구함
pattern = r'[^a-z]' # 알파벳이 아닌 문자로 split 해주어야 함.
temp = re.split(pattern, page)
for t in temp:
if t == word.lower():
site_score[mysite] += 1
return temp
def solution(word, pages):
answer = 0
max_score = -1
site_score = dict() # 기본점수
site_link_count = dict() # 링크 카운팅
site_linked = dict() # 자기를 링크하고있는 사이트들
site_index = dict() # 사이트의 인덱스
for idx, page in enumerate(pages):
get_links(page, word, idx, site_index, site_score, site_link_count, site_linked)
for site in site_score.keys():
linked_score = 0
for linked_site in site_linked[site]: # 자기를 링크한 사이트들
linked_score += (site_score[linked_site] / site_link_count[linked_site])
total_score = site_score[site] + linked_score
# 전체 점수가 최댓값이라면 갱신
if total_score > max_score:
max_score = total_score
answer = site_index[site]
elif total_score == max_score:
answer = min(answer, site_index[site])
return answer
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
'알고리즘[Python] > 프로그래머스' 카테고리의 다른 글
[ Lv 3 ] 멀리 뛰기 (0) | 2021.07.22 |
---|---|
[ Lv 3 ] 거스름돈 (0) | 2021.07.22 |
[ Lv 3 ] 단속카메라 (0) | 2021.07.21 |
[ Lv 3 ] 가장 긴 팰린드롬 (0) | 2021.07.20 |
[ Lv 3 ] [ 1차 ] 셔틀버스 (0) | 2021.07.20 |