알고리즘

프로그래머스 > 2018 KAKAO BLIND RECRUITMENT > [1차] 뉴스 클러스터링

kwonpinky 2023. 4. 17. 00:22
728x90

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

 

프로그래머스

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

programmers.co.kr

[나의 코드]

function solution(str1,str2){

  let arr1 = [];
  let arr2 = [];
  const regex= /^[a-zA-Z]*$/; 

  const getMap =(str)=>{
    let map = new Map()
     for(i=0;i<str.length-1;i++){
    if(regex.test(str[i])&&regex.test(str[i+1])){
      let text= str[i].toUpperCase()+str[i+1].toUpperCase()
    if(!map.get(text)){
      let number=1
      map.set(text,1)
    }else{
      let prev = map.get(text)
      map.set(text,prev+1)
    }
    }
  }
    return map
  }

  const getUnionMap = (map1, map2) =>{
    let tempArr1= [...map1]
    let tempArr2 =[...map2]
     let tempMap = new Map()
    for(i=0;i<map1.size;i++){
      tempMap.set(tempArr1[i][0],tempArr1[i][1])
    }
    for(i=0;i<map2.size;i++){
      if(!tempMap.get(tempArr2[i][0])){
        tempMap.set(tempArr2[i][0],tempArr2[i][1])
      }else{
        let prev = tempMap.get(tempArr2[i][0])
        tempMap.set(tempArr2[i][0],Math.max(prev,tempArr2[i][1]))
      }
    }
    return tempMap 
  }

  const makeArray=(map)=>{
    let tempArray=[...map]
    let unionArray=[];
    for(i=0;i<tempArray.length;i++){
      for(j=0;j<tempArray[i][1];j++){
        unionArray.push(tempArray[i][0])
      }
    }
    return unionArray
  }

  let union= makeArray(getUnionMap(getMap(str1),getMap(str2)))
  

  const interSectionMap =(map1,map2)=>{
    let tempArr1 = [...map1].map((item)=>item[0])
    let tempArr2 = [...map2].map((item)=>item[0])
    let interSection=tempArr1.filter(value => tempArr2.includes(value));
    let tempMap = new Map()
    for(i=0;i<interSection.length;i++){
      let minNumber=Math.min(map1.get(interSection[i]),map2.get(interSection[i]))
      tempMap.set(interSection[i],minNumber)
    }
    return tempMap
      }
  
const intersection=makeArray(interSectionMap(getMap(str1),getMap(str2)))  


 answer= union.length===0?65536:parseInt(intersection.length*65536/union.length)
  return answer
  }

아직 리팩토링은 안함...

문제를 읽고 처음에는 어 왜이렇게 쉽지? 라고 생각했다가 집합에서도 원소의 중복을 인정하는 부분을 생각못해줘서 다시 푸느라고 시간을 꽤 많이 잡아먹었다...

핵심 포인트는 교집합일 때에는 해당 두개의 배열에서 해당 원소의 중복값이 가장 적은 횟수만큼 교집합에 해당 원소가 있으면 되고, 합집합일때는 해당 원소의 중복값이 가장 큰 값만큼 합집합에 해당 원소가 있으면 된다 <= 이 부분이었다.

이거 말고도 문자열 외의 공백이나 숫자등은 무시해야한다는 조건을 위해 정규 표현식을 사용해야하고,

마지막에 합집합과 교집합이 각각 공집합일때의 케이스를 잘 처리해줘야만 20개의 테스트를 전부 통과할 수 있는 정말 무시무시한 문제였다...

 

 

728x90