관리 메뉴

Mini

프로그래머스 순위검색 c++ // 이분탐색, db설정 본문

Algorithm/이분탐색

프로그래머스 순위검색 c++ // 이분탐색, db설정

Mini_96 2024. 1. 11. 18:36

https://school.programmers.co.kr/learn/courses/30/lessons/72412

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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;
}