https://programmers.co.kr/learn/courses/30/lessons/17677
문제 해석
두 개의 스트링이 주어졌을 때, 자카드 유사도를 구하는 문제. 자세한 조건은 위 링크에서 확인하자.
간단하게, 스트링을 두 단어씩 나눈 뒤, 문자인경우만 계산해서 유사도를 구하면 쉽게 풀 수 있다.
1. 스트링을 두 글자씩 묶어서 반환 해 줄 함수를 하나 작성한다.
1-1. 문제 조건에 특수문자, 숫자인 경우는 제외한다고 나와있으므로, 이는 정규식을 활용한다.
2. 함수에서 반환된 배열을 통해 유사도를 계산한다.
2-1. 계산할 때는 두 스트링을 묶은 배열을 합친 뒤, Set으로 변경 해 중복을 제거하고, 순회하면서 min과 max를 찾아서 각자의 배열에 넣어준다.
코드
// 두 글자씩 묶어서 배열로 반환해주는 함수
function wordSplice(str){
let wordArray = []
let isAlpha = /[a-z]{2}/
for( let i = 1 ; i < str.length ; i++){
let word = (str[i-1] + str[i]).toLowerCase()
if(isAlpha.test(word)){
wordArray.push( word )
}
}
return wordArray;
}
//메인, 반환된 배열을 통해 유사도를 계산하는 함수
function solution(str1, str2) {
var answer = 0;
str1 = wordSplice(str1)
str2 = wordSplice(str2)
let strSet = new Set([...str1, ...str2])
let lastList = Array.from(strSet)
let intersection = []
let union = []
lastList.forEach(ele => {
let countStr1 = str1.filter(item => ele === item).length
let countStr2 = str2.filter(item => ele === item).length
let many = Math.max(countStr1, countStr2)
for (let i = 0 ; i < many ; i++){
union.push(ele)
}
let aLittle = Math.min(countStr1, countStr2)
for (let i = 0 ; i < aLittle ; i++){
intersection.push(ele)
}
})
if( union.length === 0 && intersection.length === 0){
answer = 1*65536
}else{
answer = parseInt((intersection.length/union.length)*65536)
}
return answer;
}
회고
제일 처음 문제를 잘못 읽어서, 문자가 아닌경우는 지우고 반환받은 문자열로 해결하려했는데, 3번 테스트케이스에서 에러가 나 다시 찬찬히 읽어보니, 특문과 숫자를 제외하고 스트링을 사용하는게 아닌, 그냥 그 스트링에 하나라도 있으면 사용하지 않는 것이었다. 문제를 똑바로 읽도록 하자.
정규식에 익숙하지 않아 아직은 찾아보면서 해야하는데, 빨리 익숙해졌으면 좋겠다.
댓글