-
[C++] ํ๋ก๊ทธ๋๋จธ์ค 2019 KAKAO BLIND RECRUITMENT ๋งค์นญ ์ ์์ฝ๋ฉํ ์คํธ/์ฝ๋ฉํ ์คํธ ์ฐ์ต 2020. 10. 28. 09:29728x90
(๊ฑฐ์ 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'์ฝ๋ฉํ ์คํธ > ์ฝ๋ฉํ ์คํธ ์ฐ์ต' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ