[문제보기]
2018 KAKAO BLIND. 뉴스 클러스터링
코딩테스트 연습 - [1차] 뉴스 클러스터링
뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브��
programmers.co.kr
[풀이방법]
먼저 문제에서 대문자와 소문자는 같은 글자로 취급한다고 했으므로 str1, str2를 모두 대문자로 변환을 시켜준다.
-> toupper() : 소문자를 대문자로 변환해주는 함수, <cctype> 필요
그리고 vector s1, s2 변수를 만들어 str1, str2의 집합을 찾아 저장해준다.
예를 들어 str1[i]와 str1[i+1]를 확인하여 둘 다 알파벳인 경우 vector s1에 push 해준다.
집합을 다 만들고 나서 s1과 s2의 교집합과 합집합을 계산해줘야 되는데 합집합인 경우 s1과 s2의 크기를 더한 값에
교집합만 빼주면 되므로 교집합만 계산을 해주면 합집합은 쉽게 구할 수 있다.
교집합을 찾을 때는 s1을 기준으로 s2에 같은 값이 있는지 확인하는 코드로 만들었다.
이 부분에서 유의해야 될 점은 다중 집합의 경우이다. for문으로 찾기 때문에 s2에서 s1과 같은 값을 찾을 경우
for문을 빠져나오면서 중복으로 찾는 경우가 없게 만들어야 되는데, 필자는 이 부분을 visit 변수를 만들어서 구현했다.
[소스코드]
#include <string>
#include <vector>
#include <cctype>
#include <iostream>
using namespace std;
vector<string> s1;
vector<string> s2;
int solution(string str1, string str2) {
int answer = 0;
for(int i=0; i<str1.size(); i++){
if('a' <= str1[i] && str1[i] <= 'z'){
str1[i] = toupper(str1[i]);
}
}
for(int i=0; i<str2.size(); i++){
if('a' <= str2[i] && str2[i] <= 'z'){
str2[i] = toupper(str2[i]);
}
}
string temp = "";
for(int i=0; i<str1.size()-1; i++){
if('A' <= str1[i] && str1[i] <= 'Z'){
if('A' <= str1[i+1] && str1[i+1] <= 'Z'){
temp += str1[i];
temp += str1[i+1];
s1.push_back(temp);
temp = "";
}
}
else{
temp = "";
}
}
temp = "";
for(int i=0; i<str2.size()-1; i++){
if('A' <= str2[i] && str2[i] <= 'Z'){
if('A' <= str2[i+1] && str2[i+1] <= 'Z'){
temp += str2[i];
temp += str2[i+1];
s2.push_back(temp);
temp = "";
}
}
else{
temp = "";
}
}
int same = 0;
int total = s1.size() + s2.size();
int m = s2.size();
vector<int> visit(m, 1);
bool flag;
for(int i=0; i<s1.size(); i++){
for(int j=0; j<s2.size(); j++){
if(visit[j] == 0) continue;
if(s1[i] == s2[j]){
visit[j] = 0;
same++;
break;
}
}
}
if(total != 0){
double sub = ((double)same/(double)(total-same)) * 65536;
answer = (int)sub;
}
else{
answer = 65536;
}
return answer;
}
[해결 과정 중 실수한 부분]
이 문제를 풀면서는 실수한 부분이 많았다. 집합을 만드는 코드 부분은 구현이 빨랐지만, 교집합을 찾는 연산에서
다중 집합의 경우를 생각 못하고 있었다. 프로그래머스에서 실행을 통해 결괏값을 확인해보면서 고민해보니 중복으로
찾는 부분을 발견하여 visit 변수를 이용하여 이를 피했다.
그리고 답을 출력하는 부분에서 floating point exception 에러가 났었는데 type casting을 생각을 못해 났던 오류이다.
'알고리즘 스터디 > Programmers' 카테고리의 다른 글
[프로그래머스][C++] 2018 KAKAO BLIND. 방금 그 곡 (level 2) (0) | 2020.08.31 |
---|---|
[프로그래머스] 2018 KAKAO BLIND 캐시 (level 2) (0) | 2020.08.27 |
[프로그래머스][C+] 2018 KAKAO BLIND. 비밀 지도 (level 1) (0) | 2020.08.26 |
[프로그래머스][C+] 2018 KAKAO BLIND. 다트 게임 (level 1) (0) | 2020.08.26 |
[Programmers][C++] N으로 표현 ( level 3) (0) | 2020.07.31 |