-
https://programmers.co.kr/learn/courses/30/lessons/17677
2017 카카오 블라인드 코딩테스트 5번 뉴스 클러스터링 문제
아이디어
먼저 원소의 조건을 체크하는 부분에서 실수하지 않게 조심해야한다
운이 좋게도 테스트 케이스에서 있었는데 str1 = "aa1+aa2" str2 = "AAAA12" 가 aa aa 과 AA AA AA로
원소가 나누어지고 합집합이 3개 교집합이 2개로{ (aa AA), (aa AA), AA } 중복도 허용 되니 이 부분만 신경쓰면 될 것 같았다.
그리고 return은 원소를 하는게 아니고 개수만 체크해서 계산하면 되기 때문에 합집합 교집합을 구하는 방법을 알고 있다면 난이도 자체는 어렵지 않았으나 중복되는 코드양이 많아서 복붙할때 집중안하면 왜맞틀? 하면서 머리 싸매고 있게되는 대참사가 벌어질 가능성도 있음
#include <string> #include <vector> #include <algorithm> using namespace std; int solution(string str1, string str2) { //문자열을 먼저 나눠야 함 vector<string> divStr1; vector<string> divStr2; //대문자로 정렬하게 int pos = 0; string s = ""; for (int i = 1; i < str1.size(); i++) { //원소 조건 체크 if (!(((str1[i - 1] >= 'A' && str1[i - 1] <= 'Z') || (str1[i - 1] >= 'a' && str1[i - 1] <= 'z')) && ((str1[i] >= 'A' && str1[i] <= 'Z') || (str1[i] >= 'a' && str1[i] <= 'z')))) continue; s = ""; // 대문자로 통일 if (str1[i - 1] >= 'A' && str1[i - 1] <= 'Z') s += str1[i - 1]; else if (str1[i - 1] >= 'a' && str1[i - 1] <= 'z') s += (str1[i-1] - 32); if (str1[i] >= 'A' && str1[i] <= 'Z') s += str1[i]; else if (str1[i] >= 'a' && str1[i] <= 'z') s += (str1[i] - 32); divStr1.push_back(s); } for (int i = 1; i < str2.size(); i++) { //원소 조건 체크 if (!(((str2[i - 1] >= 'A' && str2[i - 1] <= 'Z') || (str2[i - 1] >= 'a' && str2[i - 1] <= 'z')) && ((str2[i] >= 'A' && str2[i] <= 'Z') || (str2[i] >= 'a' && str2[i] <= 'z')))) continue; s = ""; // 대문자로 통일 if (str2[i - 1] >= 'A' && str2[i - 1] <= 'Z') s += str2[i - 1]; else if (str2[i - 1] >= 'a' && str2[i - 1] <= 'z') s += (str2[i - 1] - 32); if (str2[i] >= 'A' && str2[i] <= 'Z') s += str2[i]; else if (str2[i] >= 'a' && str2[i] <= 'z') s += (str2[i] - 32); divStr2.push_back(s); } sort(divStr1.begin(), divStr1.end()); sort(divStr2.begin(), divStr2.end()); //교집합의 개수 구하기 int intersectionCnt = 0; int i = 0, j = 0; while (i != divStr1.size() && j != divStr2.size()) { if (divStr1[i] == divStr2[j]) { intersectionCnt++; i++, j++; } else { if (divStr1[i] > divStr2[j]) { j++; } else i++; } } //합집합의 개수 구하기 // A + B - 교집합 int unionCnt = divStr1.size() + divStr2.size() - intersectionCnt; if (intersectionCnt == 0 && unionCnt == 0) return 65536; float cal = 0; cal = (float)intersectionCnt / unionCnt; int answer = cal * 65536; return answer; }
'알고리즘 > 프로그래머스' 카테고리의 다른 글
2020 카카오 인턴쉽 코딩테스트 3번 보석 쇼핑 (0) 2022.06.01 2020 카카오 인턴쉽 코딩테스트 2번 수식 최대화 (0) 2022.06.01 Programers 소수찾기 (0) 2022.03.13 Programers 프린터 (0) 2022.03.12 Programers 기능개발 (0) 2022.03.12 댓글