프렌즈 대학교 조교였던 제이지는 허드렛일만 시키는 네오 학과장님의 마수에서 벗어나, 카카오에 입사하게 되었다. 평소에 관심있어하던 검색에 마침 결원이 발생하여, 검색개발팀에 편입될 수 있었고, 대망의 첫 프로젝트를 맡게 되었다. 그 프로젝트는 검색어에 가장 잘 맞는 웹페이지를 보여주기 위해 아래와 같은 규칙으로 검색어에 대한 웹페이지의 매칭점수를 계산 하는 것이었다.
예를 들어, 다음과 같이 A, B, C 세 개의 웹페이지가 있고, 검색어가 hi라고 하자.
이때 A 웹페이지의 매칭점수는 다음과 같이 계산할 수 있다.
기본 점수는 각 웹페이지에서 hi가 등장한 횟수이다.
외부 링크수는 다른 웹페이지로 링크가 걸린 개수이다.
A 웹페이지로 링크가 걸린 페이지는 B와 C가 있다.
검색어 word와 웹페이지의 HTML 목록인 pages가 주어졌을 때, 매칭점수가 가장 높은 웹페이지의 index를 구하라. 만약 그런 웹페이지가 여러 개라면 그중 번호가 가장 작은 것을 구하라.
1
이상 20
이하이다.1
이상 1,500
이하이다.한 웹페이지의 url은 HTML의
태그 내에 태그의 값으로 주어진다.한 웹페이지에서 모든 외부 링크는 <a href=
https://careers.kakao.com/index
>의 형태를 가진다.
1
이상 12
이하이다.검색어를 찾을 때, 대소문자 구분은 무시하고 찾는다.
검색어는 단어 단위로 비교하며, 단어와 완전히 일치하는 경우에만 기본 점수에 반영한다.
결과를 돌려줄때, 동일한 매칭점수를 가진 웹페이지가 여러 개라면 그중 index 번호가 가장 작은 것를 리턴한다
pages :
["<html lang=\"ko\" xml:lang=\"ko\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta charset=\"utf-8\">\n <meta property=\"og:url\" content=\"https://a.com\"/>\n</head> \n<body>\nBlind Lorem Blind ipsum dolor Blind test sit amet, consectetur adipiscing elit. \n<a href=\"https://b.com\"> Link to b </a>\n</body>\n</html>", "<html lang=\"ko\" xml:lang=\"ko\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta charset=\"utf-8\">\n <meta property=\"og:url\" content=\"https://b.com\"/>\n</head> \n<body>\nSuspendisse potenti. Vivamus venenatis tellus non turpis bibendum, \n<a href=\"https://a.com\"> Link to a </a>\nblind sed congue urna varius. Suspendisse feugiat nisl ligula, quis malesuada felis hendrerit ut.\n<a href=\"https://c.com\"> Link to c </a>\n</body>\n</html>", "<html lang=\"ko\" xml:lang=\"ko\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta charset=\"utf-8\">\n <meta property=\"og:url\" content=\"https://c.com\"/>\n</head> \n<body>\nUt condimentum urna at felis sodales rutrum. Sed dapibus cursus diam, non interdum nulla tempor nec. Phasellus rutrum enim at orci consectetu blind\n<a href=\"https://a.com\"> Link to a </a>\n</body>\n</html>"]
<html lang="ko" xml:lang="ko" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta property="og:url" content="https://a.com"/>
</head>
<body>
Blind Lorem Blind ipsum dolor Blind test sit amet, consectetur adipiscing elit.
<a href="https://b.com"> Link to b </a>
</body>
</html>
<html lang="ko" xml:lang="ko" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta property="og:url" content="https://b.com"/>
</head>
<body>
Suspendisse potenti. Vivamus venenatis tellus non turpis bibendum,
<a href="https://a.com"> Link to a </a>
blind sed congue urna varius. Suspendisse feugiat nisl ligula, quis malesuada felis hendrerit ut.
<a href="https://c.com"> Link to c </a>
</body>
</html>
<html lang="ko" xml:lang="ko" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta property="og:url" content="https://c.com"/>
</head>
<body>
Ut condimentum urna at felis sodales rutrum. Sed dapibus cursus diam, non interdum nulla tempor nec. Phasellus rutrum enim at orci consectetu blind
<a href="https://a.com"> Link to a </a>
</body>
</html>
위의 예를 가지고 각각의 점수를 계산해보자.
기본점수 및 외부 링크수는 아래와 같다.
링크점수는 아래와 같다.
각 웹 페이지의 매칭 점수는 다음과 같다.
따라서 매칭점수가 제일 높은 첫번째 웹 페이지의 index인 0을 리턴 하면 된다.
pages :
["<html lang=\"ko\" xml:lang=\"ko\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta charset=\"utf-8\">\n <meta property=\"og:url\" content=\"https://careers.kakao.com/interview/list\"/>\n</head> \n<body>\n<a href=\"https://programmers.co.kr/learn/courses/4673\"></a>#!MuziMuzi!)jayg07con&&\n\n</body>\n</html>", "<html lang=\"ko\" xml:lang=\"ko\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta charset=\"utf-8\">\n <meta property=\"og:url\" content=\"https://www.kakaocorp.com\"/>\n</head> \n<body>\ncon%\tmuzI92apeach&2<a href=\"https://hashcode.co.kr/tos\"></a>\n\n\t^\n</body>\n</html>"]
<html lang="ko" xml:lang="ko" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta property="og:url" content="https://careers.kakao.com/interview/list"/>
</head>
<body>
<a href="https://programmers.co.kr/learn/courses/4673"></a>#!MuziMuzi!)jayg07con&&
</body>
</html>
<html lang="ko" xml:lang="ko" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta property="og:url" content="https://www.kakaocorp.com"/>
</head>
<body>
con% muzI92apeach&2<a href="https://hashcode.co.kr/tos"></a>
</body>
</html>
기본점수 및 외부 링크수는 아래와 같다.
careers.kakao.com/interview/list
의 기본점수는 0, 외부 링크 수는 1개www.kakaocorp.com
의 기본점수는 1, 외부 링크 수는 1개링크점수는 아래와 같다.
careers.kakao.com/interview/list
의 링크점수는 0점www.kakaocorp.com
의 링크점수는 0점각 웹 페이지의 매칭 점수는 다음과 같다.
careers.kakao.com/interview/list
: 0점www.kakaocorp.com
: 1 점따라서 매칭점수가 제일 높은 두번째 웹 페이지의 index인 1을 리턴 하면 된다.
def getWordCase(word):
result = set()
def DFS(L, sum):
if L == len(word):
result.add(sum)
else:
DFS(L+1, sum + word[L].lower())
DFS(L+1, sum + word[L].upper())
DFS(0, '')
return result
def solution(word, pages):
info = {}
wordCase = getWordCase(word) # set
for idx, page in enumerate(pages):
url = ''
score = 0
link = list()
urlIndex = page.find("<meta property=\"og:url\" content=\"https://") + 41
while True:
if page[urlIndex] == '\"':
break
url += page[urlIndex]
urlIndex += 1
bodyTagIndex = page.find("<body>") + 6
for i in range(bodyTagIndex, len(page)):
if page[i:i+len(word)] in wordCase and not page[i-1].isalpha() and not page[i+len(word)].isalpha():
score += 1 # 알파벳을 제외한 모든 문자로 구분
elif page[i:i+17] == "<a href=\"https://":
tmp = i+17
tmpLink = ''
while True:
if page[tmp] == '\"':
break
tmpLink += page[tmp]
tmp += 1
link.append(tmpLink)
info[url] = {"idx": idx, "score": score, "link": link, "total": score}
for cur in info.keys():
for other in info[cur]['link']:
if other in info:
info[other]['total'] = info[other].get('total') + (info[cur]['score'] / len(info[cur]['link']))
answer = list()
for cur in info.keys():
answer.append((info[cur]['idx'], info[cur]['total']))
answer.sort(key=lambda x: (-x[1], x[0]))
return answer[0][0]