프로그래머스/Lv.1
[C++] 프로그래머스 대충 만든 자판 [해쉬, Hash]
MINU.SHINNNN
2023. 2. 28. 15:44
https://school.programmers.co.kr/learn/courses/30/lessons/160586
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
타겟 문자를 만드는데 필요한 최소 클릭 횟수를 반환하는 문제입니다.
keymap에서 등장하는 각 문자를 최소 클릭 횟수로 해싱하면 답을 쉽게 구할 수 있습니다.
즉, keymap이 ["ABACD", "BCEFD"] 일때, A:1, B:1, C:2, D:5 ... 이런식으로 최소 클릭 횟수로 해싱됩니다.
해싱이 끝나면 타겟 문자에 대해 해싱값에 접근하면 되고, 이 때 해싱된 값이 0 이면 해당 문자는 keymap에 없었다는 의미이므로 만들 수 없는 문자열입니다.
따라서 break한 후 -1을 넣어줍니다.
#include <string>
#include <vector>
#include <iostream>
#include <unordered_map>
using namespace std;
int maxKeySize;
vector<int> solution(vector<string> keymap, vector<string> targets) {
vector<int> answer;
unordered_map<char, int> hash;
// 최소 클릭 횟수로 해싱
for (auto& i:keymap) {
for (int j=0; j<i.size(); j++){
if (hash[i[j]]!=0 && hash[i[j]]>j+1)
hash[i[j]]=j+1;
else if (!hash[i[j]]) hash[i[j]]=j+1;
}
}
// 타겟 문자열 클릭 횟수 구하기
for (auto& i:targets){
int sum=0;
for (int j=0; j<i.size(); j++){
// 키맵에 없는 경우
if (!hash[i[j]]) {
sum=-1;
break;
}
else sum+=hash[i[j]];
}
answer.push_back(sum);
}
return answer;
}