본문 바로가기

PS/프로그래머스

[프로그래머스 LV 2] [1차] 뉴스 클러스터링 C++/파이썬

728x90

https://programmers.co.kr/learn/courses/30/lessons/17677?language=cpp# 

 

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

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

programmers.co.kr

 

합집합과 공집합을 구해서 잘 계산하는 구현문제

string 사용에서 애를 좀 먹었다.

transform을 통해 한번에 모든 string 을 대문자나 소문자로 조정가능

toupper 쓰던 tolower쓰던

 

특수문자가 아닌 두 글자씩 나누어서 맵에 저장하고 값을 증가시켜줌

그 후 str2의 반복문에선 map의 값과 비교하며 이미 나온 문자열의 경우 공집합으로 만들어주는 과정을 거쳤음

그 후 계산

 

파이썬은 쓰면 쓸수록 너무 매력적인듯;

 

c++

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cstring>
#include <iostream>
using namespace std;
 
int solution(string str1, string str2) {
    double answer = 65536;
    unordered_map<stringint> m1;
 
    double gong = 0;
    double all = 0;
 
    transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
    transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
 
    for (int i = 0; i < (str1.size() - 1); i++) {
        if (str1[i] >= 'a' && str1[i] <= 'z' && str1[i + 1>= 'a' && str1[i + 1<= 'z') {
            string str="";
            str = str1[i];
            str += str1[i + 1];
            all++;
            m1[str] +=1;
        }
    }
    for (int i = 0; i < (str2.size() - 1); i++) {
        if (str2[i] >= 'a' && str2[i] <= 'z' && str2[i + 1>= 'a' && str2[i + 1<= 'z') {
            string str="";
            str = str2[i];
            str += str2[i + 1];
            
            //공집합을 구해야함            
            if (m1[str] >0) {
                gong++;
                m1[str]--;                
            }
            else all++;
        }        
    }
    
    if (all != 0) {
        answer = int(double(gong / all * answer));
    }
    return answer;
}
 
 
cs

 

 

파이썬 코드 졸라간단함..

remove는 가장 먼저 발견한 요소만 지워줌 즉 하나만지워줌

lower()은 다 소문자로만들어주고

조건문 [1:] 해주면 앞에꺼보다 1 뒤에있는것만 받아와줌

앞에것도 자연스럽게 마지막 인덱스까지 진출 안함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def solution(str1, str2):
    answer = 65536
    str1 = str1.lower()
    str2 = str2.lower()
    list1 = []
    list2 = []
    for s1, s2 in zip(str1, str1[1:]):
        str = s1 + s2
        if str.isalpha():
            list1.append(str)
    for s1, s2 in zip(str2, str2[1:]):
        str = s1 + s2
        if str.isalpha():
            list2.append(str)
 
    inter = [list2.remove(x) for x in list1 if x in list2]
 
    uni = len(list1) + len(list2)
    if uni != 0:
        return int(len(inter) / uni * 65536)
 
    return answer
 
cs
728x90