알고리즘/프로그래머스

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

lheunoia 2023. 5. 9. 01:18

 

 

 

 

 

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

 

프로그래머스

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

programmers.co.kr

 

이번 문제는 2021 KAKAO BLIND RECRUITMENT 문제였습니다.

 

 

 

 

 

📝 문제 풀이

1. info 배열의 각 원소의 값을 stringstream으로 공백을 제거하고 코딩테스트 점수를 제외한 값은 tmp[i][0]에 삽입

💡 tmp 벡터는 [['java', '-'], ['backend', '-'], ['junior', '-'], ['pizza', '-']] 와 같은 형태

2. scores 맵에 tmp 벡터에서 발생할 수 있는 모든 query를 키로 하여 코딩테스트 점수를 저장 ⭐️

3. scores 맵의 각 키에 대해 코딩테스트 점수를 오름차순 정렬

4. query 벡터의 각 문의조건에 대해 "and"를 제외한 [조건]을 key 변수에 저장

5. lower_bound 함수를 사용하여 scores[key]에서 코딩테스트 점수가 score 이상인 사람의 수를 찾아서 answer 벡터에 삽입

 

 

 

 

👩🏻‍💻 C++ 코드

#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <map>

using namespace std;

map<string, vector<int>> scores; // 각 query에 대한 코딩테스트 점수를 담은 객체

// 각 info에 대해 가능한 모든 query에 코딩테스트 점수 저장
void storeScore(vector<vector<string>> &tmp, int score) {
    string c1, c2, c3, c4;
    
    for (int i=0; i<2; i++) {
        c1 = tmp[0][i];
        for (int j=0; j<2; j++) {
            c2 = tmp[1][j];
            for (int k=0; k<2; k++) {
                c3 = tmp[2][k];
                for (int l=0; l<2; l++) {
                    c4 = tmp[3][l];
                    scores[c1 + c2 + c3 + c4].push_back(score);
                }
            }
        }
    }
}

vector<int> solution(vector<string> info, vector<string> query) {
    vector<int> answer;
    vector<vector<string>> tmp(4, vector<string>(2, "-"));
    
    for (int i=0; i<info.size(); i++) {
        string s;
        int idx = 0, score = 0;
        
        stringstream ss(info[i]);
        
        while (ss >> s) {
            if (idx < 4) tmp[idx++][0] = s;
            else score = stoi(s);
        }
        
        storeScore(tmp, score);
    }
    
    // 코딩테스트 점수 오름차순 정렬
    for (auto it: scores) {
        sort(scores[it.first].begin(), scores[it.first].end());
    }
    
    for (string q: query) {
        string s, key = "";
        int idx = 0, score = 0;
        
        stringstream ss(q);
        
        while (ss >> s) {
            if (s == "and") continue;
            
            if (idx < 4) {
                key += s;
                idx++;
            } else {
                score = stoi(s);
            }
        }
        
        auto it = lower_bound(scores[key].begin(), scores[key].end(), score);
        answer.push_back(scores[key].size() - (it - scores[key].begin()));
    }
    
    return answer;
}

 

프로그래머스 - 결과 화면

 

 

 

 

반응형