ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 2019 KAKAO BLIND RECRUITMENT ๋งค์นญ ์ ์ˆ˜
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต 2020. 10. 28. 09:29
    728x90

    (๊ฑฐ์˜ 4์‹œ๊ฐ„..?)

    ์ •๋‹ต๋ฅ  6%๋ฌธ์ œ๋ผ๋Š”๋ฐ ์†”์งํžˆ ์–ด๋ ต๋‹ค๊ธฐ๋ณด๋‹จ ๊ณ ๋ คํ•ด์•ผ ๋  ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ณ  ๋‹ค์–‘ํ•œ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ. ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์‹œ๊ฐ„ ๋‚ด์— ํ’€๋ผ๋‚˜ใ…‹ใ…‹

    C++๋กœ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ์ง„์งœ ๋ถˆํŽธํ•˜๋‹ค๋Š”๊ฑธ ๊นจ๋‹ซ๊ฒŒ ํ•ด์คฌ๋‹ค. C++๋กœ ์†Œ๋ฌธ์ž ๋ณ€ํ™˜ ์ฒ˜์Œ ์จ๋ณธ๋“ฏ

    ๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ƒ‰์–ด๊ฐ€ <body> ํŒŒํŠธ์—์„œ ์ฐพ๋Š”์ง€ ๋ฌธ์ž์—ด ์ „์ฒด์—์„œ ์ฐพ๋Š”์ง€ ์„ค๋ช…์ด ๋ถˆ์นœ์ ˆํ•˜๋‹ค. (body์—์„œ๋งŒ ์ฐพ์•„๋„ ๋œ๋‹ค.)

     

    ์•„์ด๋””์–ด๋Š” ๊ฒฐ๊ตญ

    1. ์†Œ๋ฌธ์ž ๋Œ€๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ๊ฒ€์ƒ‰์ด ๋˜์•ผํ•˜๋‹ˆ๊นŒ word์™€ pages๋ฅผ ๋ชจ๋‘ ์†Œ๋ฌธ์ž ๋ณ€ํ™˜์‹œํ‚จ๋‹ค

    2. ๊ฐ page๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” url๋ฅผ ์ฐพ์•„์„œ ์ €์žฅํ•œ๋‹ค.

    3. ๊ฐ page๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์™ธ๋ถ€ ๋งํฌ๋ฅผ ์ฐพ์•„ ์ €์žฅํ•œ๋‹ค.

    4. ๊ฐ page๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ…์ŠคํŠธ์™€ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋น„๊ตํ•ด ๊ธฐ๋ณธ ์ ์ˆ˜ ์ €์žฅํ•œ๋‹ค.

    5. ๊ฐ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธฐ๋ณธ์ ์ˆ˜์™€ ์™ธ๋ถ€ ๋งํฌ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด ๋งค์นญ์ ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

    6. ๋งค์นญ ์ ์ˆ˜๋ฅผ ์ •๋ ฌํ•ด์„œ ์ •๋‹ต์„ ๊ตฌํ•œ๋‹ค.

     

    ์ด ๊ณผ์ •์—์„œ string ์ „์ฒด๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ํŠน์ • ๋ฌธ์ž์—ด ๋ชจ๋‘ ์ฐพ๊ธฐ, string ํ† ํฐํ™” ๊ณผ์ • ๋“ฑ ๋ฌธ์ž์—ด์„ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉํ•ด์•ผ ๋œ๋‹ค.

    ๋‹ค ํ’€์—ˆ๋Š”๋ฐ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค 9, 10์ด ํ‹€๋ ค์„œ ๋ณ„ ์ง“์„ ๋‹คํ•ด๋„ ๋ชป์ฐผ์•˜๋Š”๋ฐ

    (9๋ฒˆ ์˜ค๋ฅ˜) url๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ "content=\"https://" ์ด๊ฒƒ๋งŒ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์˜ค๋ฅ˜๋‚˜๊ณ  "<meta property=\"og:url\" content=\"https://" ์ด๊ฑธ ํ†ต์ฑ„๋กœ ๊ฒ€์‚ฌํ•ด์•ผ๋œ๋‹ค.

    (10๋ฒˆ ์˜ค๋ฅ˜) ์™ธ๋ถ€ ๋งํฌ ๊ฒ€์ƒ‰ํ•  ๋•Œ "href=\"https://"ํ•˜๋ฉด ์˜ค๋ฅ˜๋‚˜๊ณ  "<a href=\"https://"๋ฅผ ์จ์ค˜์•ผ ํ†ต๊ณผํ•œ๋‹ค.

     

    #include <vector>
    #include <algorithm>
    #include <map>
    #include <sstream>
    #include <string>
    
    using namespace std;
    
    // ์•ŒํŒŒ๋ฒณ์ด ์•„๋‹Œ ๊ฒฝ์šฐ
    bool wordChange(char c) {
    	return c == '\'' || !isalpha(c);
    }
    
    // first๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ second๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ
    bool comp(pair<double, int> a, pair<double, int> b) {
    	if (a.first == b.first) return a.second < b.second;
    	return a.first > b.first;
    }
    
    int solution(string word, vector<string> pages) {
    	// word ์†Œ๋ฌธ์ž๋กœ ์น˜ํ™˜
    	transform(word.begin(), word.end(), word.begin(), ::tolower); // ::์ด๊ฑฐ ์•ˆ์จ์ฃผ๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ ์˜ค๋ฅ˜๋‚จ
    
    	// url์ด๋ฆ„๊ณผ ๊ทธ์— ๋งž๋Š” index ์ €์žฅ
    	map<string, int> urlName;
    	// ๊ฐ index๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” url ๋งํฌ ์ €์žฅ
    	vector<vector<string>> links;
    	// ๊ฐ index๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธฐ๋ณธ ์ ์ˆ˜
    	vector<int> basicScore;
        // ๋งค์นญ ์ ์ˆ˜์™€ ์ธ๋ฑ์Šค
    	vector<pair<double, int>> matchScore;
    
    	for (int i = 0; i < pages.size(); i++) {
    		// ์›นํŽ˜์ด์ง€ ์†Œ๋ฌธ์ž ์น˜ํ™˜
    		transform(pages[i].begin(), pages[i].end(), pages[i].begin(), ::tolower);
    
    		// ์›นํŽ˜์ด์ง€ url ์•Œ์•„๋‚ด๊ณ  ์ €์žฅ
    		string content = "<meta property=\"og:url\" content=\"https://";
    		int contentPos = pages[i].find(content);
    		int contentStart = contentPos + content.size();
    		int contentEnd = pages[i].substr(contentStart).find("\"/>");
    		urlName[pages[i].substr(contentStart, contentEnd)] = i + 1;
    
    		// body ํŒŒํŠธ ๋ถ„๋ฆฌ
    		int bodyStartIdx = pages[i].find("<body>");
    		int bodyEndIdx = pages[i].find("</body>");
    		string bodyPage = pages[i].substr(bodyStartIdx, bodyEndIdx - bodyStartIdx);
    
    		// ์™ธ๋ถ€ ๋งํฌ ํƒ์ƒ‰
    		vector<string> link;
    		string href = "<a href=\"https://";
    		int hrefPos = bodyPage.find(href);
    		while (hrefPos != std::string::npos)
    		{
    			int hrefStart = hrefPos + href.size();
    			int hrefEnd = bodyPage.substr(hrefStart).find("\">");
    			link.push_back(bodyPage.substr(hrefStart, hrefEnd));
    			hrefPos = bodyPage.find(href, hrefStart + hrefEnd);
    		}
    
    		// index๊ฐ€ ๊ฐ€์ง„ ์™ธ๋ถ€ ๋งํฌ ์ €์žฅ
    		links.push_back(link);
    
    		// ํŠน์ˆ˜ ๋ฌธ์ž๋“ค๋„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•ŒํŒŒ๋ฒณ์ด ์•„๋‹์‹œ ์‹น๋‹ค ๊ณต๋ฐฑ์œผ๋กœ ๋ณ€ํ™˜
    		replace_if(bodyPage.begin(), bodyPage.end(), wordChange, ' ');
    
    		// body ํŒŒํŠธ์—์„œ ๊ฒ€์ƒ‰์–ด์™€ ๋น„๊ตํ•ด ๊ธฐ๋ณธ ์ ์ˆ˜ ์ €์žฅ
    		int score = 0;
    		istringstream iss(bodyPage);
    		string token;
    		while (getline(iss, token, ' ')) {
    			if (word.compare(token) == 0)
    				score++;
    		}
    		basicScore.push_back(score);
    	}
        
        // ๊ฐ ์ธ๋ฑ์Šค์— ๊ธฐ๋ณธ ์ ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค
    	for (int i = 0; i < links.size(); i++) {
    		matchScore.push_back(make_pair(basicScore[i], i));
    	}
        
        // ๊ฐ ์ธ๋ฑ์Šค์— ๋งํฌ ์ ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
    	for (int i = 0; i < links.size(); i++) {
    		int linkSize = links[i].size();
    		for (int j = 0; j < linkSize; j++) {
                // url์ด ์กด์žฌํ•  ๊ฒฝ์šฐ์—๋งŒ ๊ณ„์‚ฐ
    			if (urlName[links[i][j]] != 0) {
    				matchScore[urlName[links[i][j]] - 1].first += (double)basicScore[i] / (double)linkSize;
    			}
    		}
    		
    	}
        
        // ๋งค์นญ ์ ์ˆ˜๋ฅผ ์ •๋ ฌํ•œ๋‹ค(์ ์ˆ˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ธ๋ฑ์Šค๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ)
    	sort(matchScore.begin(), matchScore.end(), comp);
        
        // ๋งค์นญ์ ์ˆ˜๊ฐ€ ์ œ์ผ ๋†’์€ ๊ฒƒ๋“ค ์ค‘ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ฒฝ์šฐ
    	return matchScore[0].second;
    }
    728x90

    ๋Œ“๊ธ€

Designed by Tistory.