[프로그래머스] 순위 검색 (문제 설명, 해결 과정, 코드 전문, c++)
문제 설명 |
본 문제는 프로그래머스의 순위 검색 문제입니다.
https://programmers.co.kr/learn/courses/30/lessons/72412
해결 과정 |
입력 문자열에 대해 파싱을 위한 함수를 사용하였습니다. 코드 전문에서 볼 수 있는 parse_info, parse_query 함수 입니다.
문제설명에서 볼 수 있듯 효율성을 따집니다. 그렇기에 해쉬맵을 이용하였습니다. 이번의 경우 column이 5개이기에
4중 해쉬맵에 마지막 해쉬맵의 value 값으로는 vector가 사용되었습니다.
입력되는 info의 문자열들을 하나씩 가져와 해당되는 조건들을 4중 해쉬맵의 key로써 value vector에 점수들을 집어넣습니다. 그리고 이 문제의 쿼리입력 문자열에서 "-"이 특수하게 사용되는데 이는 해당 조건에 한 해서 모든 경우를 수용한다는 의미입니다. 기존 쿼리들이 사용언어를 예를 "Java", "Python"을 언급하였다면 "-"의 의미는 이러한 언어들 모두를 포함한다는 의미입니다. 그렇기에 조건문에 "-" 올 수 있는 모든 경우에도 조건에 해당되는 4중 해쉬 속 vector에 점수를 집어넣습니다. 이후 쿼리입력 문자열을 반복해 해당되는 조건의 vecotr 사이즈를 반환배열에 담아 최종적으로 반환합니다.
코드 전문 |
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
void parse_info(string &s, string &l, string &p, string &r, string &f, int &score)
{
l = s.substr(0, s.find(' ')); s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
p = s.substr(0, s.find(' ')); s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
r = s.substr(0, s.find(' ')); s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
f = s.substr(0, s.find(' ')); s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
score = stoi(s);
}
void parse_query(string &s, string &l, string &p, string &r, string &f, int &score)
{
l = s.substr(0, s.find(' ')); s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
p = s.substr(0, s.find(' ')); s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
r = s.substr(0, s.find(' ')); s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
f = s.substr(0, s.find(' ')); s = s.substr(s.find(' ')+1, s.size()-s.find(' '));
score = stoi(s);
}
vector<int> solution(vector<string> info, vector<string> query) {
vector<int> answer;
unordered_map<string, unordered_map<string, unordered_map<string, unordered_map<string, vector<int>>>>> m;
string lang; string pos; string role; string food; int score;
for (auto s : info)
{
parse_info(s, lang, pos, role, food, score);
m[lang][pos][role][food].emplace_back(score);
m["-"][pos][role][food].emplace_back(score);
m[lang]["-"][role][food].emplace_back(score);
m[lang][pos]["-"][food].emplace_back(score);
m[lang][pos][role]["-"].emplace_back(score);
m["-"]["-"][role][food].emplace_back(score);
m["-"][pos]["-"][food].emplace_back(score);
m["-"][pos][role]["-"].emplace_back(score);
m[lang]["-"]["-"][food].emplace_back(score);
m[lang]["-"][role]["-"].emplace_back(score);
m[lang][pos]["-"]["-"].emplace_back(score);
m["-"]["-"]["-"][food].emplace_back(score);
m["-"][pos]["-"]["-"].emplace_back(score);
m["-"]["-"][role]["-"].emplace_back(score);
m[lang]["-"]["-"]["-"].emplace_back(score);
m["-"]["-"]["-"]["-"].emplace_back(score);
}
int count;
for (auto q : query)
{
count = 0;
parse_query(q, lang, pos, role, food, score);
for (auto i : m[lang][pos][role][food])
{
if (i >= score) count++;
}
answer.emplace_back(count);
}
return answer;
}
느낀 점 (잡설 99% , 배운점 1%(많은 편)) |
string.find()는 문자만 찾습니다. 문자열 넣지맛!
그래도 잘 풀었다고 생각합니다. "-"가 올 수 있는 모든 경우는 하드코딩을 해버렸는데, 고심 끝에 축약해 코딩을 하였더라면 이 코드를 보는 다른 사람 입장에선 정말 난해하게 보였을 거 같아 그렇지 않았습니다.
너무 코드의 길이에 신경을 써 미시적인? 코드를 만들어버리는 건 앞뒤가 안 맞는 일 같다 생각했습니다.
그리고 4중 해쉬맵이라니 떨렸습니다. 그리고 재밌네요! . 기분이 좋아 한 문제 더 풀려했는데, 그 문제에선 막혔습니다. 고마우신 유튜브 선생님 덕분에 해답을 알았지만 그 문제는 프로그래머스 LV2를 다 클리어 한 다음 풀어보겠습니다.
긴 글 읽어주셔서 감사합니다.
부족한 점이 있다면 부디 알려주시면 감사하겠습니다.