Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

코린이 탈출기

[2018 KAKAO BLIND RECRUITMENT][JAVASCRIPT] 뉴스 클러스터링 본문

문제 풀이

[2018 KAKAO BLIND RECRUITMENT][JAVASCRIPT] 뉴스 클러스터링

명란파스타 2020. 9. 11. 23:33

문제 바로가기

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브��

programmers.co.kr

 

소요시간 : 50분 - 1시간

 

<문제 풀이 Logic>

1. 대소문자 구분을 하지 않기 때문에 각 str을 모두 소문자로 만들어준다.

2. str을 두 글자씩 끊어서 tmp에 저장하고 tmp가 모두 알파벳으로 돼있다면 str_arr에 저장한다.

-> 아스키코드 활용(a~z: 97~122)

str_arr 저장형태 : {tmp: tmp 개수}

3. str_arr의 key를 str_key 배열에 넣어두고 이 배열을 순회하며 두 str_arr에 key가 중복하는 경우에 Intersect에 그 중 min값을 더해준다.

4. Union은 각 str_arr의 개수를 모두 센 Total에서 Intersect를 빼주면 된다.

 

 

-전체 코드-

<!DOCTYPE html>

<body>
    <script>
        function solution(str1, str2) {
            var answer = 0;
            str1 = str1.toLowerCase();
            str2 = str2.toLowerCase();

            let str1_arr = [];
            let str2_arr = [];
            // console.log(str1);
            // console.log(str2);

            for(let i = 0; i<str1.length-1; i++)
            {
                let tmp = str1.slice(i, i+2);
                if(tmp.charCodeAt(0)>=97 && tmp.charCodeAt(0)<=122)
                {
                    if(tmp.charCodeAt(1)>=97 && tmp.charCodeAt(1)<=122)
                    {
                        if(str1_arr[tmp] != null)
                            str1_arr[tmp]++;
                        else
                            str1_arr[tmp] = 1;           
                    }
                }    

            }

            //97~122
            for(let i = 0; i<str2.length-1; i++)
            {
                let tmp = str2.slice(i, i+2);
                if(tmp.charCodeAt(0)>=97 && tmp.charCodeAt(0)<=122)
                {
                    if(tmp.charCodeAt(1)>=97 && tmp.charCodeAt(1)<=122)
                    {
                        if(str2_arr[tmp] != null)
                            str2_arr[tmp]++;
                        else
                            str2_arr[tmp] = 1;
                    }
                }    
            }


            console.log(str1_arr);
            console.log(str2_arr);

            let str1_key = Object.keys(str1_arr);
            let str2_key = Object.keys(str2_arr);
            console.log(str1_key);
            console.log(str2_key);

            let Total = 0;
            let Union = 0;
            let Intersect = 0;

            for(let i = 0; i<str1_key.length; i++)
            {
                for(let j = 0; j<str2_key.length; j++)
                {
                    if(str1_key[i] == str2_key[j])
                    {
                        Intersect += Math.min(str1_arr[str1_key[i]], str2_arr[str2_key[j]]);
                        break;
                    }
                }
            }

            for(let i= 0; i<str1_key.length; i++)
            {
                Total += str1_arr[str1_key[i]];
            }

            for(let i = 0; i<str2_key.length; i++)
            {
                Total += str2_arr[str2_key[i]];
            }

            Union = Total - Intersect;

            // console.log(Total);
            // console.log(Union);
            // console.log(Intersect);

            if(Union == 0 && Intersect == 0)
                answer = 65536;
            else
                answer = Math.floor(Intersect/Union * 65536);
            console.log(answer);

            return answer;
        }

        solution("FRANCE", "french")
        solution("handshake","shake hands");
        solution("aa1+aa2", "AAAA12")
        solution("E=M*C^2",    "e=m*c^2")
    </script>
</body>