728x90

문제


https://school.programmers.co.kr/learn/courses/30/lessons/17677

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드


function solution(str1, str2) {
  str1 = str1.toUpperCase();
  str2 = str2.toUpperCase();

  const strToSet = (str) => {
    let set = [];

    for (let i = 1; i < str.length; i++) {
      if (/^[a-z|A-Z]+$/.test(str[i - 1]) && /^[a-z|A-Z]+$/.test(str[i])) {
        set.push(str[i - 1] + str[i]);
      }
    }

    return set;
  };

  const jaccard = (arr1, arr2) => {
    let similarity = 0;

    // arr1, arr2 모두 공집합이면 J(A, B) = 1
    if (arr1.length === 0 && arr2.length === 0) similarity = 1;
    else {
      let union = []; // 합집합
      let intersection = []; // 교집합

      for (let i = 0; i < arr2.length; i++) {
        // arr2의 각 요소에 대해 arr1에도 존재한다면
        if (arr1.indexOf(arr2[i]) >= 0) {
          // 교집합에 해당 요소 넣고 arr1에서 해당 요소 삭제
          intersection.push(arr1.splice(arr1.indexOf(arr2[i]), 1));
        }
        // 합집합에 arr2의 요소 모두 넣기
        union.push(arr2[i]);
      }

      // 합집합에 교집합에서 삭제된 요소 외의 arr1의 요소 모두 넣기
      for (let i = 0; i < arr1.length; i++) {
        union.push(arr1[i]);
      }

      similarity = intersection.length / union.length;
    }

    return similarity;
  };

  let set1 = strToSet(str1);
  let set2 = strToSet(str2);
  let answer = jaccard(set1, set2);

  return parseInt(answer * 65536);
}

 

후기


  • 입력으로 받는 문자열을 집합으로 묶는 함수와, 자카드 유사도를 return하는 함수 두개를 만들어 코드를 짰다. 다른 부분은 쉽게 코드를 짰지만 다중집합에서의 합집합, 교집합을 구하는 데는 생각의 시간이 조금 필요했다. 
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀

+ Recent posts