2017년 카카오 blind 코딩 테스트 - 뉴스 클러스터링 python
출처 : https://programmers.co.kr/learn/courses/30/lessons/17677
문제 풀이
이 문제는 주어진 2개의 문자열에 대해 글자 2개씩으로 된 중복을 허용하는 집합을 만들고 자카드 유사도(교집합/합집합)를 구하는 문제입니다.
집합 set()을 이용해 intersection()과 union()을 이용해 유사도를 계산하면 쉽겠지만, 중요한 건 set은 중복을 허용하지 않는다는게 문제입니다.
그래서 collections.Counter를 이용해서 중복되는 개수를 허용하는 자료형을 씁니다.
또한 collections.Counter는 교집합(&), 합집합(|)을 제공합니다.
[1] 문제에서 볼 수 있듯이 소문자와 대문자는 무시하므로 lower()를 이용해 문자열을 소문자로 만듭니다.
[2] 문자열에서 앞에서부터 문자 2개씩 끊을 것입니다. 이때 특수문자가 포함되었는지 확인을 해야겠죠.
- 정규화를 활용하기 위해 regex(re) 라이브러리를 활용합니다.
- 소문자가 포함하기 위해 [a-z]를 쓸 것이고, 두 개의 소문자를 포함하기 위해서 [a-z][a-z]로 표현식을 만들고 re.compile(‘[a-z]{2}’)로 pattern을 만들고 search를 이용해 확인합니다.
- 특수문자가 포함된다면 None을 출력하므로 if문으로 거르면 됩니다.
테스트 1의 결과는
['fr', 'ra', 'an', 'nc', 'ce'] # str1
['fr', 're', 'en', 'nc', 'ch'] # str2
[3] 다음 나온 List를 collections.Counter에 넣습니다.
테스트 1의 경우
Counter({'fr': 1, 'ra': 1, 'an': 1, 'nc': 1, 'ce': 1}) # str1
Counter({'fr': 1, 're': 1, 'en': 1, 'nc': 1, 'ch': 1}) # str2
테스트 3의 경우
Counter({'aa': 2})
Counter({'aa': 3})
[4] &를 이용해 교집합을 구하여 List로 넣고 sum으로 더해버리면 교집합 개수를 구할 수 있습니다. 마찬가지로 |를 이용해 합집합을 구하고 List로 넣어 sum으로 더하면 합집합 개수를 구합니다.
Counter.values()는 값들을 리스트로 반환합니다.
테스트 2의 경우에는
Counter({'ha': 2, 'sh': 1, 'ak': 1, 'ke': 1, 'an': 1, 'nd': 1, 'ds': 1})
dict_values([2, 1, 1, 1, 1, 1, 1]) # intersections.values()
[2, 1, 1, 1, 1, 1, 1] # list(intersections.values())
[5] 자카드 유사도(=교집합/합집합) 반환하면 끝!! :D
'Algorithm' 카테고리의 다른 글
Python 구간 사이의 최소 제곱근 찾기 (0) | 2019.09.27 |
---|---|
graph shortest path - 최단 경로 다익스트라 알고리즘 python (0) | 2019.09.27 |
2017년 카카오 blind 코딩 테스트 - 추석 트래픽 python (2) | 2019.09.25 |
Queue 큐 python (0) | 2019.09.23 |
codility - binary gap python (0) | 2019.09.22 |