๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90
๐Ÿ”—๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๐Ÿ‘จ‍๐Ÿ’ปํ’€์ด ๊ณผ์ •

 

์ •๋ง ์ •๋ง ์ •๋ง ์ •๋ง ์ •๋ง ์งœ์ฆ๋‚ฌ๋˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. 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;
}

 

 

728x90
๋ฐ˜์‘ํ˜•