Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- LIS #Algorithm #요소추적
- BFS
- 보석쇼핑
- c++
- 카카오
- 소감
- 코딩테스트
- BaekJoon
- 중반부
- 코테
- 카카오인턴
- 스마일게이트
- 알고리즘
- 유니온파인드
- Union-find
- 1편
- 삼성 #코테 #2020상반기 #c++
- 백준
- Algorithm
- 투포인터
- 식단
- IBK기업은행 #기업은행 #디지털 #직무 #정리
- 서버개발캠프
- Smilegate
Archives
- Today
- Total
짱아의 개발 기록장
프로그래머스. 뉴스클러스터링(c++) / String 본문
반응형
그렇게 난이도가 높지는 않은 문자열 처리 문제였다.
2개씩 단위로 나누어서 다중집합(중복이 가능한)을 만들고
다중 집합들의 합집합과 교집합을 구하는 문제!
합집합, 교집합을 구하는 방법에는 여러가지가 있겠지만, c++ STL을 사용해서 풀었다.
set_union => 합집합
set_intersection => 교집합
그리고! set_union, set_intersection을 사용할 때 중요한 점!!!!!
반드시 각각의 집합이 정렬되어있는 상태여야한다.
그래서 이전에 s1, s2를 sort를 해주었다.
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
50
51
52
53
54
55
56
57
58
59
60
61
|
// 뉴스클러스터링
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cctype>
#include <iostream>
using namespace std;
vector<string> s1;
vector<string> s2;
int solution(string str1, string str2) {
int answer = 0;
int kyo = 0; // 교집합
int hab = 0; // 합집합
// 두글자씩 끊을 때 모두 영문자로 구성된 쌍만 유효하다.
for(int i=0; i<str1.size()-1; i++){
if(('a'<=str1[i] && str1[i]<='z' || 'A'<=str1[i] && str1[i]<='Z') && ('a'<=str1[i+1] && str1[i+1]<='z' || 'A'<=str1[i+1] && str1[i+1]<='Z')){
string temp = "";
temp += tolower(str1[i]);
temp += tolower(str1[i+1]);
s1.push_back(temp);
}
}
for(int i=0; i<str2.size()-1; i++){
if(('a'<=str2[i] && str2[i]<='z' || 'A'<=str2[i] && str2[i]<='Z') && ('a'<=str2[i+1] && str2[i+1]<='z' || 'A'<=str2[i+1] && str2[i+1]<='Z')){
string temp = "";
temp += tolower(str2[i]);
temp += tolower(str2[i+1]);
s2.push_back(temp);
}
}
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
// 합집합
vector<string> buff1(s1.size() + s2.size());
auto iter1 = set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), buff1.begin());
buff1.erase(iter1, buff1.end());
hab = buff1.size();
// 교집합
vector<string> buff2(s1.size() + s2.size());
auto iter2 = set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), buff2.begin());
buff2.erase(iter2, buff2.end());
kyo = buff2.size();
if(kyo==0 && hab==0){
return 65536;
}
float similarity = (float)kyo/hab;
answer = similarity * 65536;
return answer;
}
|
cs |
반응형
'Algorithm > Programmers' 카테고리의 다른 글
프로그래머스. 여행경로(c++) / DFS + 백트래킹 (0) | 2021.02.27 |
---|---|
(강추)프로그래머스. 구명보트(c++) / Greedy+Two pointer (0) | 2021.02.21 |
[실력체크 level 1] 가장 작은 숫자 제거하기! (0) | 2021.02.20 |
[실력체크 level 1] 문자열을 숫자로! (0) | 2021.02.20 |
프로그래머스. 등굣길(c++) / DP+BFS or DP+DFS (0) | 2021.01.09 |
Comments