어흥
[프로그래머스] 순위 검색 (C++) 본문
728x90
반응형
문제 링크: https://programmers.co.kr/learn/courses/30/lessons/72412
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
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 삼각 달팽이 (C++) (0) | 2021.09.29 |
---|---|
[프로그래머스] 오픈채팅방 (C++) (0) | 2021.09.28 |
[프로그래머스] 메뉴 리뉴얼 (C++) (0) | 2021.09.10 |
[프로그래머스] 신규 아이디 추천 (C++) (0) | 2021.09.10 |
[프로그래머스] 복서 정렬하기 (C++) (0) | 2021.09.10 |
Comments