문제
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
(1) 비교할 문자열을 소문자로 통일시킨 후 알파벳으로만 이루어진 문자열인지 검사하여 배열에 push한다.
(2) 배열의 filter 메서드와 concat 메서드를 사용하여 교집합, 합집합을 구한다. temp 배열 생성 후 교집합에 포함된 문자열은 제거한다. (합집합을 구할 때 중복 문자열이 들어가는 것을 방지하기 위해)
(3) 문제 조건에 맞게 65536을 곱한 후에 소수점 아래를 버리고 정수만 return한다.
function solution(str1, str2) {
const leftStr = [];
const rightStr = [];
const lowerStr1 = str1.toLowerCase();
const lowerStr2 = str2.toLowerCase();
for (let i = 0; i < lowerStr1.length - 1; i++) {
const substringStr = lowerStr1.substring(i, i + 2);
if (/^[a-z]{2}$/.test(substringStr)) {
leftStr.push(substringStr);
}
}
for (let i = 0; i < lowerStr2.length - 1; i++) {
const substringStr = lowerStr2.substring(i, i + 2);
if (/^[a-z]{2}$/.test(substringStr)) {
rightStr.push(substringStr);
}
}
const {intersection, union} = getIntersectionAndUnion(leftStr, rightStr);
const jacquard = union.length === 0 ? 1 : intersection.length / union.length;
const answer = Math.floor(jacquard * 65536);
return answer;
}
const getIntersectionAndUnion = (arr1, arr2) => {
const arr2Copy = [...arr2];
const intersection = arr1.filter(item => {
const index = arr2Copy.indexOf(item);
if (index > -1) {
arr2Copy.splice(index, 1);
return true;
}
return false;
});
const union = arr1.concat(arr2Copy);
return {
intersection,
union
};
}
결론
카카오 레벨2 문제이다.
교집합과 합집합을 구하는 방법은 여러개 존재하지만 그 중에서 배열 메서드를 사용하여 문제를 해결하였다.
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 숫자 카드 나누기 (JS) (2) | 2024.11.20 |
---|---|
[프로그래머스] 과제 진행하기 (JS) (2) | 2024.11.16 |
[프로그래머스] 붕대 감기 (JS) (2) | 2024.11.02 |
[백준] 그룹 단어 체커 (JS) (3) | 2024.10.16 |
[백준] 회의실 배정 (JS) (0) | 2024.10.12 |