알고리즘
프로그래머스 > 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])&®ex.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