2023. 7. 10. 15:35ใCoding Test/Programmers
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐จ๐ปํ์ด ๊ณผ์
์ ๋ง ์ ๋ง ์ ๋ง ์ ๋ง ์ ๋ง ์ง์ฆ๋ฌ๋ ๋ฌธ์ ์ ๋๋ค. C++์ ์ Python์ฒ๋ผ ๋ฌธ์์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ฐ๋ ฅํ์ง ์์ ๊ฑธ๊น์...
๋ฌธ์ ๋ฅผ ๋ณด์๋ง์ ์๊ฐ๋ฌ๋ ๊ฑด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์๊ฐ ๋ ๋ฐฐ์ ๋ B+ ํธ๋ฆฌ์์ง๋ง, ์ฝ๋ฉ ํ ์คํธ ์น ๋ ์ธ์ ๊ทธ๊ฑธ ๋ค ๊ตฌํํ๊ฒ ์ต๋๊น... ๋ ธ๊ฐ๋ค์ ์ธ(๋ธ๋ฃจํธ ํฌ์ค) ๋ฐฉ๋ฒ ๋ง๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ ๊ณ ๋ฏผํ๋ค๊ฐ ์์ด์ ๋ค๋ฅธ ์ฌ๋๋ค ํ์ด๋ฅผ ์ฝ๊ฐ๋ง ๋ดค๋๋ฐ, ๊ฑฐ์ ๋ค ๋ธ๋ฃจํธ ํฌ์ค๋ก ์ฟผ๋ฆฌ๋ฅผ ์ถ๊ฐํด ๋๋ ๋ฐฉ๋ฒ์ ์ฐ์ จ๋๋ผ๊ตฌ์.
๊ฐ๋ น ์๋ฅผ ๋ค์ด, "java backend junior pizza 150"์ ๋ฐ์ดํฐ(info)๊ฐ ๋ค์ด์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. 150์ ์ฝ๋ฉ ํ ์คํธ ์ ์๋ผ ๋ณ๋๋ก ๋ณด๊ธฐ์, ์ฌ๊ธฐ์์ ๋ด์ผ ํ ์นดํ ๊ณ ๋ฆฌ ์ข ๋ฅ๋ ์ด 4๊ฐ์ง์ ๋๋ค. ํ์ง๋ง ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ "-"๋ ์ฟผ๋ฆฌ์ ๋ค์ด๊ฐ ์ ์์ผ๋ฏ๋ก, ํด๋น ๋ฐ์ดํฐ์์ ํ์๋ ์ ์๋ ์ฟผ๋ฆฌ์ ์ข ๋ฅ๋ ์ด 16๊ฐ์ง์ ๋๋ค.
"java", "backend", "junior", "pizza"
"java", "backend", "junior", "-"
"java", "backend", "-", "pizza"
"java", "backend", "-", "-"
...
์ฆ, ํต์ฌ์ ํ๋์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ ๋, ํด๋น ๋ฐ์ดํฐ๋ก๋ถํฐ ํ์๋ ์ ์๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฌธ๋ค์ ์ ์ฅํด ๋๋ ๊ฒ์ ๋๋ค.
๊ทธ ํ, ์ค์ ์ฟผ๋ฆฌ์์ ํด๋น ์ฟผ๋ฆฌ๋ฌธ์ ํค(key) ๊ฐ์ผ๋ก ํ์ฌ ์ํ๋ value๋ฅผ ์ฐพ๋ ์ ๋ต์ด์ง์.
ํ์ง๋ง value(์ฆ, ์ฝ๋ฉํ ์คํธ ์ ์๋ค)์๋ ์ค๋ณต๋ ๊ฐ๋ ์์ ๊ฒ์ด๊ณ , ์ผ์ ๊ธฐ์ค ์ ์ ์ด์์ธ ์ฌ๋๋ค ์๋ฅผ ๊ตฌํ๋ ค๋ฉด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์ํ์์ ์ด์ง ํ์(Binary search)๋ฅผ ํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๋์ ์ ๋ multiset์ ์ฌ์ฉํ์๋๋ฐ, ํจ์จ์ฑ ํ ์คํธ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ด์ต๋๋ค... ์๋ฌด๋๋ ํธ๋ฆฌ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ๋ง์ ์๊ฐ์ด ์์๋๋ ๋ด ๋๋ค. ๊ทธ๋์ multiset์์ vector๋ก ๋ฐ๊พธ๊ณ , ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ์ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ๋ฅผ ์งํํ์์ต๋๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <algorithm>
using namespace std;
const int MAX_CATEGORIES = 4;
vector<string> Split(string str, const string delimiter) {
int removeNums = delimiter.length();
int startIdx = 0;
vector<string> result;
while (true) {
int findIdx = str.find(delimiter, startIdx);
if (findIdx == str.npos)
break;
string token = str.substr(startIdx, findIdx - startIdx);
result.emplace_back(token);
startIdx = findIdx + removeNums;
}
string remainedStr = str.substr(startIdx);
istringstream tokenizer(remainedStr);
string buffer;
while (getline(tokenizer, buffer, ' ')) result.emplace_back(buffer);
return result;
}
void RegistKey(map<string, vector<int>>& database, const vector<string>& tokens, string buffer, int idx) {
if (idx == MAX_CATEGORIES) {
database[buffer].emplace_back(stoi(tokens.back()));
return;
}
RegistKey(database, tokens, buffer + tokens[idx], idx + 1);
RegistKey(database, tokens, buffer + "-", idx + 1);
}
vector<int> solution(vector<string> info, vector<string> query) {
map<string, vector<int>> database;
vector<int> answer;
// 1. 16๊ฐ์ง ๊ฒฝ์ฐ์ ๋ชจ๋ ๊ฐ๋ฅํ ์ฟผ๋ฆฌ ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ
for (const auto& data : info) {
istringstream tokenizer(data);
vector<string> tokens(MAX_CATEGORIES + 1);
tokenizer >> tokens[0] >> tokens[1] >> tokens[2] >> tokens[3] >> tokens[4];
RegistKey(database, tokens, "", 0);
}
// 2. ์ฟผ๋ฆฌ ๋ด ๋ฐ์ดํฐ๋ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
for (auto& info : database)
sort(info.second.begin(), info.second.end());
//// 3. ์ฟผ๋ฆฌ์ ๋ํ ๋ต ์ถ๊ฐํ๊ธฐ
for (const auto& request : query) {
vector<string> splitStr = Split(request, " and ");
int codingTestScore = stoi(splitStr.back());
string key;
for (int i = 0; i < splitStr.size() - 1; i++)
key += splitStr[i];
auto findIt = lower_bound(database[key].begin(), database[key].end(), codingTestScore);
answer.emplace_back(database[key].size() - (findIt - database[key].begin()));
}
return answer;
}
'Coding Test > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Programmers] Lv2. ๋จ์ฒด์ฌ์ง ์ฐ๊ธฐ | C++ (0) | 2023.08.12 |
---|---|
[Programmers] Lv2. ์นด์นด์คํ๋ ์ฆ ์ปฌ๋ฌ๋ง๋ถ | C++ (0) | 2023.07.13 |
[Programmers] Lv2. ์ด๋ชจํฐ์ฝ ํ ์ธํ์ฌ | C++ (2) | 2023.07.09 |
[Programmers] Lv2. ์๊ฒฉ ์์คํ | C++ (0) | 2023.07.06 |
[Programmers] Lv2. ํผ์์ ํ๋ ํฑํํ | C++ (0) | 2023.07.05 |