1. 문제
- 2019 카카오 코딩테스트 매칭 점수 문제
- 조건에 따라 문자열을 적절히 처리해주는 문제
- 테스트케이스 9번, 10번이 까다롭다.
2. 풀이
- 다들 정규식을 사용하였으나 실제 시험이었다면 정규식을 모르고 들어갔을 것이므로 정규식 없이 풀어봄
- 코드는 상당히 지저분하고 시간 및 공간 효율이 좋지 못하나 매우 이해하기 쉽게 짰음
#### 9번과 10번 테스트 케이스 실패한 경우 ######
- 9번은 meta 태그 내의 url을 파싱하지 못해서, 10번은 a 태그 내의 링크를 파싱하지 못해서 실패가 뜬다.
- 9번과 10번을 해결하기 위해서는 각각 문제 조건에 주어진대로 9번의 url은 meta태그 내에서만, 10번의 링크는 a태그 내에서만 가져와야 한다. 아마 href 혹은 https가 태그 밖에도 존재해 해당 문자열이 파싱되는 경우 실패가 뜨는 것으로 보인다.
- strip을 이용한 공백처리, head태그 밖에 있는지, content property="og:url" 등 다양한 테스트를 해봤으나 전부 관련이 없고 그냥 문제에서 언급한 대로만 처리하면 된다.
###
- 혹시 런타임에러가 뜬다면 점수 구하는 부분에서 0으로 나눠서 그럴 가능성이 크다. 즉 링크가 없는 경우 등
- C에 비해서 확실히 문자열 처리가 파이썬이 편하다. 국내 코딩테스트에 문자열처리 문제가 빈번하게 나와 파이썬이 애용되는 것 같다.
3. 사전지식(파이썬 index, find, lower, split)
1) index(찾을문자, 찾기시작할위치, 끝 위치)
>>> s = '룰루랄라 이히리히 우후후'
>>> s.index('이')
5
>>> s.index('룰')
0
>>> s.index('룰',5)
존재하지 않기 때문에 값 오류(ValueError)가 발생한다.
2) find(찾을문자, 찾기시작할위치)
>>> s = '룰루랄라 이히리히 우후후'
>>> s.find('이')
5
>>> s.find('룰')
0
>>> s.find('룰',5)
-1
find는 문자열중에 특정문자를 찾고 위치를 반환해준다, 없을경우 -1을 리턴
4. 코드
def solution(word, pages):
url = []
link = []
base_score = []
# 메타 태그 내에 있는 https url 파싱
for page in pages :
while True :
start = page.index('<meta')
end = page.index('>', start)
if not "https://" in page[start:end] :
page = page[end: ]
continue
page = page[start:end]
start = page.index('https://')
end = page.index('"/', start)
url.append(page[start:end])
break
# a 태그 내에 있는 https url 파싱
for page in pages :
temp = []
while True :
if "<a" not in page :
break
start = page.index("<a")
page = page[start:]
start = page.index('"')+1
end = page.index('"',start)
temp.append(page[start:end])
page = page[end : ]
link.append(temp)
# body 태그 내에 있는 문자열 파싱, word 매칭을 위함
body = []
for i, page in enumerate(pages) :
start = page.index("<body>")
end = page.index("</body>")
body.append(page[start:end])
# word와 body 내 문자열 모두 소문자로 변경
for b in body :
cnt = 0
cnt += cnt_word(word.lower(), b.lower())
base_score.append(cnt)
# 점수 계산
N = len(pages)
total = [0] * N
link_s = [0] * N
for i in range(N) :
if not link[i] :
continue
link_s[i] += base_score[i] / len(link[i])
for i in range(N) :
for a in link[i] :
if a not in url :
continue
base_score[url.index(a)]+= link_s[i]
return base_score.index(max(base_score))
# body 내 문자열 중 소문자 알파벳이 아닌 경우 공백으로 바꾼 후 공백 기준으로 split 해줌. 그 후 Count
def cnt_word(word, b) :
replace_b = ''
for char in b :
if not ("a"<= char <= "z"):
replace_b += ' '
else :
replace_b += char
return replace_b.split(' ').count(word)
5. 개선 사항
- 정규식 공부..
- 시간 및 공간 효율 개선 가능함..
'알고리즘 > 프로그래머스' 카테고리의 다른 글
2018 카카오 코딩테스트 - 추석 트래픽, 파이썬 (0) | 2021.03.04 |
---|---|
2019 카카오 블라인드 코딩 테스트 - 블록게임, 파이썬 (0) | 2021.03.03 |
2019 KAKAO BLIND RECRUITMENT- 길 찾기 게임, 파이썬 (0) | 2021.02.26 |
2019 KAKAO BLIND RECRUITMENT- 무지의 먹방 라이브, 파이썬 (0) | 2021.02.25 |
2019 KAKAO BLIND RECRUITMENT- 후보키, 파이썬 (0) | 2021.02.25 |