[프로그래머스] 대충 만든 자판 - c++

삼식이·2025년 5월 18일
0

알고리즘

목록 보기
55/81

대충 만든 자판

이 문제는 구현문제이다.

각 target 문자열 (ex, "ABCD", "AABB")에 대하여 keymap 중 적게 눌러서 target 문자열의 각 문자('A','B','C','D')를 찾는 key 누르는 횟수를 누적하여 해당 target문자열의 최소 누름 횟수를 저장하면 된다.

1번키 ABACD 2번키는 BCEFD
target: ABCD

  • 1번키 1 번 누르기
  • 2번키 1 번 누르기
  • 2번키 2 번 누르기
  • 1번키 5 번 누르기

즉, 각 타겟문자열 (targets[i])의 각 문자 (targets[i][j])에 대해 keymap[k].find(targets[i][j]+1) 가 작은 값이 최소 횟수이다.

각 문자에 대한 최소 횟수의 합은 해당 타겟문자열의 키 누르기 최솟값이다.

타겟문자열의 임의의 문자를 keymap의 모든 문자열들 중에서 찾지 못했다면 ans = -1 로 설정하고 바로 반복문을 빠져나오면 된다.

[전체 코드]

#include <string>
#include <vector>
#include <cmath>
#include <iostream>

using namespace std;

vector<int> solution(vector<string> keymap, vector<string> targets) {
    vector<int> answer;
    // 키 최대 100개 
    // 키를 최소 몇번 눌러야 그 문자열 작성
    // 1번키 ABACD 2번키는 BCEFD
    // target: ABCD
    // 1번키 1
    // 2번키 1
    // 2번키 2
    // 1번키 5
    
    for(int i=0; i<targets.size(); i++) {
        string now_t = targets[i];
        int ans = 0;
        for(int j=0; j<now_t.size(); j++) {
            size_t tmp = 104;
            for(int k=0; k<keymap.size(); k++) {
                size_t fin = keymap[k].find(now_t[j]);
                if (fin != string::npos) {
                    tmp = min(tmp, fin+1);
                    continue;
                }
            }
            if (tmp == 104) {
                ans = -1;
                break;
            }
            else {
                ans += tmp;
            }
        }
        answer.push_back(ans);
    }
    
    return answer;
}

0개의 댓글