ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 17677 뉴스 클러스터링 [C++]
    개발/문제풀이 2020. 1. 19. 15:42

    https://programmers.co.kr/learn/courses/30/lessons/17677

    bool IsLowerChar(char c) {
    	return (c >= 'a' && c <= 'z');
    }
    
    string ToLowerCase(string str) {
    	const int diff = 'A' - 'a';
    
    	for (int i = 0; i < str.length(); i++)
    	{
    		if (str[i] >= 'A' && str[i] <= 'Z')
    			str[i] -= diff;
    	}
    	return str;
    }
    
    int solution(string str1, string str2) {
    
    	str1 = ToLowerCase(str1);
    	str2 = ToLowerCase(str2);
    	
    	unordered_map<string, int> map1, map2;
    
    	for (int i = 0; i < str1.length(); i++) {
    		if (IsLowerChar(str1[i]) && IsLowerChar(str1[i + 1])) {
    			string elem = str1.substr(i, 2);
    			map1[elem]++;
    		}
    	}
    	for (int i = 0; i < str2.length(); i++) {
    		if (IsLowerChar(str2[i]) && IsLowerChar(str2[i + 1])) {
    			string elem = str2.substr(i, 2);
    			map2[elem]++;
    		}
    	}
    
    	int mapSize1 = 0, mapSize2 = 0;
    	int intersectionCount = 0, unionCount = 0;
    
    	for (auto pair : map1)
    		mapSize1 += pair.second;
    	for (auto pair : map2)
    		mapSize2 += pair.second;
    
    	for (auto pair : map1) {
    		intersectionCount += min(pair.second, map2[pair.first]);
    	}
    
    	unionCount = mapSize1 + mapSize2 - intersectionCount;
    
    	if (unionCount <= 0)
    		return 65536;
    
    	float similarity = ((float)intersectionCount / unionCount) * 65536;
    	return (int)similarity;
    }

    ToLowerCase와 IsLowerChar은 내부 라이브러리 함수로 대체하고, unionCount를 계산하는 과정을 더 단순하게 만들 수 있어 보인다.

    '개발 > 문제풀이' 카테고리의 다른 글

    프로그래머스 17678 추석 트래픽 [C++]  (0) 2020.05.01
    프로그래머스 17683 방금그곡 [C++]  (0) 2020.04.24
Designed by Tistory.