반응형
대충 만든 자판
이제는 익숙해진 문자열과 숫자 한번에 다루기!
문제를 몇번 풀어보니, 이 문제 역시 문자열과 숫자 개념이 더해진 것임을 바로 파악할 수 있었고, map을 사용하여 쉽게 해결할 수 있었다.
자판의 등장하는 문자를 char형태의 index로 보고, 어떤 위치의 버튼이든 최소한으로 눌렀을 때를 그 알파벳의 버튼 횟수로 저장하도록 하였다.
그러니까 keymap을 순회하면서, 등장하는 문자를 map의 인덱스로 넣고, 해당 위치를 저장하였다.
그리고 같은 문자가 또 한번 등장할 때마다 기존에 저장해 두었던 위치와 비교해보아서 더 작은 위치로 갱신되도록 하였다.
이렇게 하여 문자당 최소 터치 수를 map에 저장해 두면 80 프로는 다 한 것이다!!
이제 targets을 순회하면서 해당 문자의 최소 터치 수가 저장된 map에서 값을 가져와 count시키고,
만약 해당 문자가 map에 존재하지 않는다면, 작성할 수 없는 문자열이므로, 문제에서 요구한 것처럼 count를 -1로 하고, 해당 문자열은 넘어가도록 코드를 구현했다.
그리고 한 문자열씩 돌때마다 answer벡터에 count값을 push해주면 끝!
코드는 아래와 같다.
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<int> solution(vector<string> keymap, vector<string> targets) {
vector<int> answer;
map<char, int> m1;
for (int i = 0; i < keymap.size(); i++) {
for (int j = 0; j < keymap[i].size(); j++) {
if (m1.find(keymap[i][j]) == m1.end()) {//map에 존재하지 않은 문자면 입력
m1.insert(pair<char, int>(keymap[i][j], j+1));
}
else {
if (m1[keymap[i][j]] > j + 1) {
m1[keymap[i][j]] = j + 1;//더작은 값으로 바꾼다
}
}
}
}
int cnt;
for (int i = 0; i < targets.size(); i++) {
cnt = 0;
for (int j = 0; j < targets[i].size(); j++) {
if (m1.find(targets[i][j]) == m1.end()) {
cnt = -1;
break;
}
auto temp = targets[i][j];
cnt += m1[temp];
}
answer.push_back(cnt);
}
return answer;
}
반응형
'CO-TE > 프로그래머스' 카테고리의 다른 글
[프로그래머스] c++ LV2 택배 배달과 수거하기 (2023 KAKAO BLIND RECRUITMENT) 풀이/접근 방식 (0) | 2023.10.12 |
---|---|
[프로그래머스] c++ LV2 요격 시스템 풀이/접근방법 (0) | 2023.10.12 |
[프로그래머스] c++ LV1 덧칠하기 (1) | 2023.09.13 |
[프로그래머스] c++ LV1 공원 산책 (0) | 2023.09.04 |
[프로그래머스] c++ LV1 추억 점수 (0) | 2023.09.01 |