[프로그래머스 -LEVEL 2 - [1차] 뉴스 클러스터링 ]

정대만·2023년 6월 30일

코딩테스트

목록 보기
9/51
post-thumbnail

문제 해석

  • 교집합과 합집합을 구하는 공식

교집합 + A (나머지) =A
라고 생각하면 빠르게 구할수 있다.

틀린부분

  • 아스키 코드 변환
    str1.charCodeAt(i) == 문자열 . chatCodeAt( 문자열 번호 )
  • 아스키 코드 대문자 65 ~90 || 소문자 97 ~ 122
    -indexof 그냥 외우자
    str1.indexOf(i)
  • ==NaN 은 존재하지 않는다. isNaN () 을 넣어서 null 인지 체크하기
function solution(str1, str2) {
    var answer = 0;
    // var Max_count= Math.max(str1.length, str2.length);
     var puhs_str1=[];
     var puhs_str2=[];
    
    for(var i=0; i<str1.length; i++){
        if(
            (
            (str1.charCodeAt(i)>=65 &&str1.charCodeAt(i)<=90) 
            || (str1.charCodeAt(i)>=97 &&str1.charCodeAt(i)<=122)
            )
            
              &&  
            (
              (str1.charCodeAt(i+1)>=65 &&str1.charCodeAt(i+1)<=90) 
            || (str1.charCodeAt(i+1)>=97 &&str1.charCodeAt(i+1)<=122)
        )
             )
                {
               puhs_str1.push ( (str1[i]+str1[i+1]).toLowerCase())
                }
        
    }
    
    
     for(var i=0; i<str2.length; i++){
        if(
            (
            (str2.charCodeAt(i)>=65 &&str2.charCodeAt(i)<=90) 
            || (str2.charCodeAt(i)>=97 &&str2.charCodeAt(i)<=122)
            )
            
              &&  
            (
              (str2.charCodeAt(i+1)>=65 &&str2.charCodeAt(i+1)<=90) 
            || (str2.charCodeAt(i+1)>=97 &&str2.charCodeAt(i+1)<=122)
        )
             )
                {
               puhs_str2.push ( (str2[i]+str2[i+1]).toLowerCase())
                }
        
    }
    
    //2개씩 체크해주면서 배열 구하기 
    
    
    

    
    var gogo=[]; // 교집합 구하는 식
    var total=[];// 합집합 
    
   for(var i=0; i<puhs_str1.length; i++){
       if(puhs_str2.includes(puhs_str1[i])){
           gogo.push(puhs_str1[i]);
     
          var find_indx=puhs_str2.indexOf(puhs_str1[i]);
           puhs_str2.splice(find_indx,1);
           puhs_str1.splice(i,1);
           i-=1;
       }
   }
   
   // 같은거 나오는 경우에는 push 해주고 서로의 집합에서 splice 해준다. 
   //i-=1 해준이유는 i 가 계속이동하기 때문에 에러가 발생
 
    
    total=  gogo.concat(  puhs_str2.concat(puhs_str1));
    //전체를 concat 으로 2번 묶어서 합집합 구하기 
    
    
     var gogo= Math.floor(( (gogo.length)/(total.length) ) *  console.log(gogo,'total')
     if(gogo==1 || isNaN(gogo)){
         return 65536;
     }
     return gogo;
}

다른 사람 풀이 참조



function solution (str1, str2) {
  
  //
  function explode(text) {
    const result = [];
    for (let i = 0; i < text.length - 1; i++) {
      const node = text.substr(i, 2);
      if (node.match(/[A-Za-z]{2}/)) {
        result.push(node.toLowerCase());
      }
    }
    return result;
  }

  const arr1 = explode(str1);
  const arr2 = explode(str2);
  const set = new Set([...arr1, ...arr2]);
  let union = 0;
  let intersection = 0;

  //같은 원소를 검사해서 많은  쪽은 union에 더하고 적은쪽은 intersection에 더한다.
  set.forEach(item => {
    const has1 = arr1.filter(x => x === item).length;
    const has2 = arr2.filter(x => x === item).length;
    union += Math.max(has1, has2);
    intersection += Math.min(has1, has2);
  })
  return union === 0 ? 65536 : Math.floor(intersection / union * 65536);
}
profile
안녕하세요

0개의 댓글