https://school.programmers.co.kr/learn/courses/30/lessons/72412
1. db설정 : map<string, vector<int>> m;
카카오 문제는 db설정을 잘해야한다.
java back junior pizza 100 일때,
각각각 빈칸인경우와 빈칸아닌경우로 분기하면서
모든경우의 수에 대해(2^4)
m[문자열] = { 100, ... } db를 완성한다.
2. 쿼리에서는 단순 조회만하면된다.
m[javaback] = {1,2,3,4,4,5} 가있을떄,
4를 찾고있으면 end에서 4의위치(lower_bound)를 빼주면된다
3. 전체코드
#include <bits/stdc++.h>
using namespace std;
map<string, vector<int>> m;
void go(string str, int idx, vector<string>& ret){
if(idx==4){
//cout<<str<<"\n";
m[str].push_back(stoi(ret[4]));
return;
}
go(str+ret[idx],idx+1,ret);
go(str,idx+1,ret);
}
vector<string> split(string input, string deli) {
long long pos=0;
vector<string> ret;
string token = "";
while ((pos=input.find(deli)) != string::npos) {
token = input.substr(0, pos);
ret.push_back(token);
input.erase(0, pos + deli.size());
}
//마지막 192.168.0.1 의 1저장
ret.push_back(input);
return ret;
}
vector<int> solution(vector<string> info, vector<string> query) {
vector<int> answer;
// m["hello java"].push_back(1);
// m["hello java"].push_back(23);
// for(auto i : m["hello java"]) cout<<i<<" ";
for(auto i : info){
vector<string> ret=split(i," ");
go("",0,ret); //2^4가지 경우의수의 맵에 점수를 넣는함수
}
for(auto item : m){
sort(m[item.first].begin(),m[item.first].end());
}
for(int i=0;i<query.size();++i){
vector<string>ret=split(query[i]," ");
string s="";
if(ret[0]=="-"){
//pass
}
else{
s+=ret[0];
}
if(ret[2]=="-"){
//pass
}
else{
s+=ret[2];
}
if(ret[4]=="-"){
//pass
}
else{
s+=ret[4];
}
if(ret[6]=="-"){
//pass
}
else{
s+=ret[6];
}
answer.push_back(m[s].end()-lower_bound(m[s].begin(),m[s].end(),stoi(ret[7])));
}
return answer;
}
'Algorithm > 이분탐색' 카테고리의 다른 글
백준 2467 두용액 c++ //이분탐색 정답후보를 탐색하라 (0) | 2024.03.24 |
---|---|
백준 18869 멀티버스2 c++ // 값을 idx로 바꿔라, 이분탐색이용, unique사용법 (0) | 2024.03.11 |
백준 1654 랜선자르기 c++ // 이분탐색, parametric search (0) | 2024.01.04 |
백준 2295 세수의합 c++ // 이분탐색 발상 (0) | 2024.01.03 |
백준 18870 좌표압축 c++ // 이분탐색 (0) | 2024.01.02 |