어흥

[프로그래머스] 순위 검색 (C++) 본문

알고리즘/프로그래머스

[프로그래머스] 순위 검색 (C++)

라이언납시오 2021. 9. 10. 20:58
728x90
반응형

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/72412

 

코딩테스트 연습 - 순위 검색

["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt

programmers.co.kr

1. 주의할 점

- 각 케이스에 대한 처리를 어떻게 할 것인가('-' 처리가 중요)

 

2. 구현

- V[개발언어][직군][경력][소울푸드] 벡터에 점수를 저장하며, 기존 형식+1만큼 초기화한다(0번째 인덱스로 '-'를 처리하기 위해 추가)

- Lang() 함수를 통해 개발언어에 해당하는 숫자를 반환한다

- Job() 함수를 통해 직군에 해당하는 숫자를 반환한다

- Exp() 함수를 통해 경력에 해당하는 숫자를 반환한다

- Food() 함수를 통해 소울푸드에 해당하는 숫자를 반환한다

- Info를 위의 함수들로 처리하며 반환된 숫자는 Temp 벡터에 저장한다

- Temp 벡터와 DFS() 함수를 통해 '-' 처리와 '-'가 아닌거에 대한 처리를 수행한다. 즉, 2가지의 경우가 총 4개있으므로 2^4가지의 경우에 점수를 추가한다

- V[][][][]를 모두 오름차순 정렬하여 Query의 점수와 비교했을 때, Answer를 쉽게 도출할 수 있도록 한다

- Query에 포함된 정보를 Temp 벡터에 저장하여 V[][][][]와 비교해서 Answer에 넣는다

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;
vector<int> v[4][3][3][3];
int check[4]={0,};
vector<int> temp;

int lang(string str){
    if(str=="-") return 0;
    else if(str=="cpp") return 1;
    else if(str=="java") return 2;
    else return 3;
}

int job(string str){
    if(str=="-") return 0;
    else if(str=="backend") return 1;
    else return 2;
}

int exp(string str){
    if(str=="-") return 0;
    else if(str=="junior") return 1;
    else return 2;
}

int food(string str){
    if(str=="-") return 0;
    else if(str=="chicken") return 1;
    else return 2;
}

void dfs(int cnt){
    if(cnt==4){
        v[check[0]][check[1]][check[2]][check[3]].push_back(temp[4]);
        return;
    } 
    dfs(cnt+1);
    check[cnt]=temp[cnt];
    dfs(cnt+1);
    check[cnt]=0;
}

vector<int> solution(vector<string> info, vector<string> query) {
    vector<int> answer;
    string str;
    for(int i=0;i<info.size();i++){
        istringstream ss(info[i]);
        int cnt=0;
        temp.clear();
        while(getline(ss,str,' ')){
            int val;
            if(cnt==0) val = lang(str);
            else if(cnt==1) val = job(str);
            else if(cnt==2) val = exp(str);
            else if(cnt==3) val = food(str);
            else val = stoi(str);
            temp.push_back(val);
            cnt++;
        }
        dfs(0);
    }
    for(int i=0;i<4;i++)
        for(int j=0;j<3;j++)
            for(int k=0;k<3;k++)
                for(int m=0;m<3;m++)
                    sort(v[i][j][k][m].begin(),v[i][j][k][m].end());
    
    for(int i=0;i<query.size();i++){
        istringstream ss(query[i]);
        int cnt=0;
        temp.clear();
        int val;
        while(getline(ss,str,' ')){
            if(cnt==0) val = lang(str);
            else if(cnt==2) val = job(str);
            else if(cnt==4) val = exp(str);
            else if(cnt==6) val = food(str);
            else if(cnt==7) val = stoi(str);
            if(cnt%2==0 || cnt==7)
                temp.push_back(val);
            cnt++;
        }
        int ll = v[temp[0]][temp[1]][temp[2]][temp[3]].size();
        int idx=ll;
        for(int j=0;j<ll;j++){
            if(v[temp[0]][temp[1]][temp[2]][temp[3]][j]>=temp[4]){
                idx=j;
                break;
            }
        }
        answer.push_back(ll-idx);
    }
    return answer;
}
728x90
반응형
Comments