알고리즘 공부

1 minute read

뉴스 클러스터링 - 카카오 2018
https://programmers.co.kr/learn/courses/30/lessons/17677
생각은 단순했는데 새로 배운게 많았던 문제였다.

  • 대소문자를 가리지 않고 비교하므로 tmp[0]=toupper(tmp[0])으로 모두 대문자를 만들어준 부분
  • 소수점을 다루는 부분에서 소수 뒷자리를 버리고 계산할 때 (int)0.1-0.05 하면 앞에꺼만 int가 씌워진다는 부분
  • 계산을 할때는 캐스팅이 꼭 필요한 부분들이 있었다.
    라이브러리를 더 사용하면 더 간단히 풀 수 있었지만 지금 이거를 더 정확하고 빠르게 하는게 중요한 것 같다.

    ```cpp #include #include #include using namespace std;

int solution(string str1, string str2) { int answer = 0; vector group1; vector group2; string tmp = ""; for (int i = 0; i < str1.size(); i++) { tmp = str1.substr(i, 2); tmp[0] = toupper(tmp[0]); tmp[1] = toupper(tmp[1]); if ((tmp[0] >= 'A' && tmp[0] <= 'Z') && (tmp[1] >= 'A' && tmp[1] <= 'Z')) { group1.push_back(tmp); } tmp.clear(); } for (int i = 0; i < str2.size(); i++) { tmp = str2.substr(i, 2); tmp[0] = toupper(tmp[0]); tmp[1] = toupper(tmp[1]); if ((tmp[0] >= 'A' && tmp[0] <= 'Z') && (tmp[1] >= 'A' && tmp[1] <= 'Z')) { group2.push_back(tmp); } tmp.clear(); } int CNTU = 0; int CNTN = 0; for (int i = 0; i < group1.size(); i++) { bool check = false; for (int j = 0; j < group2.size(); j++) { if (group1[i] == group2[j]) { CNTU++; CNTN++; group2[j]=""; check = true; break; } } if (!check) CNTU++; } for(int i = 0; i <group2.size();i++){ if(group2[i]!=""){ CNTU++; } } float divideNum; if(CNTU==0&&CNTN==0) divideNum = 1; else{ divideNum = (float) (CNTN / CNTU); } answer = (int)(divideNum * 65536); return answer; } ```
소요시간 ; 1시간+30분